【问题标题】:mysql : Get latest value and sum of values from previous hourmysql:获取前一小时的最新值和值的总和
【发布时间】:2014-02-17 21:55:31
【问题描述】:

我想退回产品及其最新价值和上一小时的价值。

我有一个产品表:

id, name, type (and so on)...

我有一个值表:

id_prod, timestamp, value

类似:

12:00:00 = 10
12:15:00 = 10
12:30:00 = 10
12:45:00 = 10
13:00:00 = 10
13:15:00 = 10
13:30:00 = 10

我想要一个返回最新值 (13:30:00) 以及一小时前的值总和的查询。这应该返回:

time = 13:30:00
latestread = 10
lasthour = 40

我几乎开始工作的是:

SELECT *,
(SELECT value FROM values S WHERE id_prod=P.id 
ORDER BY timestamp DESC LIMIT 1) as latestread,
(SELECT sum(value) FROM values WHERE id_prod=D.id and 
date_created>SUBTIME(S.date_created,'01:00:00')) as trendread 
FROM prod P ORDER BY name

但这失败了“'where子句'中的未知列'S.date_created'”

有什么建议吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果我正确理解您要执行的操作,那么您将有类似的内容:

    SELECT p.id, max(date_created), sum(value), mv.max_value
    FROM product p
    JOIN values v on p.id = v.product_id
    JOIN (SELECT product_id, value as max_value
          FROM values v2
          WHERE date_created = (SELECT max(date_created) FROM values WHERE product_id=v2.product_id)) mv on product_id=p.id
    WHERE date_created between DATE_SUB(now(), INTERVAL 1 HOUR)) and now()
    GROUP BY p.id
    ORDER BY p.id
    

    【讨论】:

    • 是的,这对我有用。但是,如果我不将“SELECT max(date_created) FROM values WHERE product_id=v2.product_id”更改为“SELECT max(date_created) FROM values WHERE product_id=99”(其中 99 是产品的实际 id),则运行需要一分钟我查询)。我不明白为什么......但无论如何,现在它有效!谢谢
    【解决方案2】:

    Aleks G 和 mhasan 给出了解决方案,但没有给出失败的原因。失败的原因是因为在子查询中不知道别名 S。子查询对其范围之外的表一无所知。

    【讨论】:

      【解决方案3】:

      您错过了在下面的子查询中为表值提供别名

      SELECT *,
      (SELECT value FROM values S WHERE id_prod=P.id 
      ORDER BY timestamp DESC LIMIT 1) as latestread,
      (SELECT sum(value) FROM values S WHERE id_prod=P.id and 
      date_created>SUBTIME(S.date_created,'01:00:00')) as trendread 
      FROM prod P ORDER BY name
      

      【讨论】:

        【解决方案4】:

        我认为这是您尝试编写的查询:

        SELECT p.*,
              (SELECT v.value
               FROM values v
               WHERE v.id_prod = p.id 
               ORDER BY v.timestamp DESC
               LIMIT 1
              ) as latestread,
              (SELECT sum(v.value)
               FROM values v
               WHERE v.id_prod = p.id and 
                     v.timestamp > SUBTIME(now(), '01:00:00')
             ) as trendread 
        FROM prod p
        ORDER BY p.name;
        

        这会将所有别名更改为表名的缩写。它还通过使用now() 修复了最后一小时的表达式,并摆脱了date_created,根据问题,这似乎不在任何一个表中。该查询方便地假定timestampdatetime。如果是 unix 时间戳,则需要稍微不同的时间逻辑。

        使用values(id_prod, timestamp, value) 上的索引应该相当有效。

        【讨论】:

          猜你喜欢
          • 2016-11-23
          • 2019-08-03
          • 2021-07-20
          • 2020-08-16
          • 2018-10-30
          • 2018-10-22
          • 1970-01-01
          • 2022-01-03
          • 1970-01-01
          相关资源
          最近更新 更多