我有下表:
id value truncated_day just_yyyy_mm_dd 1167 300 7/1/11 0:00 7/1/11 1167 301 7/1/11 0:00 7/1/11 1167 303 7/1/11 0:00 7/1/11 1167 308 7/1/11 0:00 7/1/11 1167 312 7/2/11 0:00 7/2/11 1167 316 7/2/11 0:00 7/2/11 1167 318 7/2/11 0:00 7/2/11 1167 330 7/2/11 0:00 7/2/11 1700 0 7/1/11 0:00 7/1/11 1700 10 7/1/11 0:00 7/1/11 1700 21 7/1/11 0:00 7/1/11 1700 33 7/1/11 0:00 7/1/11 1700 34 7/2/11 0:00 7/2/11 1700 35 7/2/11 0:00 7/2/11 1700 40 7/2/11 0:00 7/2/11
该表实际上非常长(超过3200万行!!)。
我希望每天都有最大值和最小值(read_value),以及每个不同的id。我尝试了以下查询,但它不起作用:
'$'select id,
date_trunc('day', timestamp_utc) as truncated_day,
substring(cast(date_trunc('day', timestamp_utc) as text) from 1 for 10) as just_yyyy_mm_dd,
max(value) as maxvalue,
min(value) as minvalue
from TABLE
order by device_id, truncated_day'$'
我基本上希望返回查询:
id min max truncated_day just_yyyy_mm_dd 1167 300 308 7/1/11 0:00 7/1/11 1167 312 330 7/2/11 0:00 7/2/11 1700 0 33 7/1/11 0:00 7/1/11 1700 34 40 7/2/11 0:00 7/2/11
你可以帮我解决这个问题吗? 非常感谢你提前! Ñ
答案 0 :(得分:2)
试试这个。注意添加GROUP BY。如果需要,可以重新添加just_yyyy_mm_dd。
select id,
date_trunc('day', timestamp_utc) as truncated_day,
max(value) as maxvalue,
min(value) as minvalue
from TABLE
GROUP BY id, date_trunc('day', timestamp_utc)
order by device_id, truncated_day
答案 1 :(得分:0)
在“order by”之前,你需要一个“group by”。基本上你需要按前3个字段进行分组。
答案 2 :(得分:0)
您需要将order by
更改为group by
。实际上,你可能想要两者:
select device_id, date_trunc('day', timestamp_utc) as truncated_day,
substring(cast(date_trunc('day', timestamp_utc) as text) from 1 for 10) as just_yyyy_mm_dd,
max(value) as maxvalue,
min(value) as minvalue
from TABLE
group by device_id, date_trunc('day', timestamp_utc)
order by device_id, truncated_day
我很好奇group by device_id, truncated_day
是否有效。 SQL编译器是否在just_yyyy_mm_dd列上生成错误?它不会需要来生成错误,但它可能无法将该表达式识别为仅在聚合列上。
答案 3 :(得分:0)
select id, min(value) as 'minvalue', max(value) as 'maxvalue', truncated_day, just_yy_mm_dd
from the_table
group by truncated_day, id, just_yy_mm_dd