mysql:获取前一小时的最新值和值之和

时间:2014-02-17 13:33:20

标签: mysql sql

我想将产品与最近一小时的最新价值和价值一起退回。

我有一个产品表:

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'失败了

有什么建议吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您错过了在

下面的子查询中为表值提供别名
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

答案 3 :(得分:0)

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

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)上的索引,这应该是合理有效的。