SQL查询以查找每个不同日期的最大值和最小值

时间:2013-01-11 18:36:59

标签: sql postgresql

我有下表:

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

你可以帮我解决这个问题吗? 非常感谢你提前! Ñ

4 个答案:

答案 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