PSQL选择每分钟每个ID的最大值,每个ID每分钟多个值?
问题描述:
给定一个表,看起来像这样:PSQL选择每分钟每个ID的最大值,每个ID每分钟多个值?
sensor_id | time | voltage -----------+------------------------+------------ 12292 | 2009-12-01 00:50:04-07 | 2270 12282 | 2009-12-01 00:50:04-07 | 93774 12192 | 2009-12-01 00:50:04-07 | 9386 12609 | 2009-12-01 00:50:05-07 | 0 12566 | 2009-12-01 00:50:08-07 | 0 12659 | 2009-12-01 00:50:19-07 | 540 12660 | 2009-12-01 00:50:19-07 | 550 12661 | 2009-12-01 00:50:19-07 | 510 12656 | 2009-12-01 00:50:19-07 | 30240 12657 | 2009-12-01 00:50:19-07 | 14930 12658 | 2009-12-01 00:50:19-07 | 17420 11820 | 2009-12-01 00:50:26-07 | 1.38 11832 | 2009-12-01 00:50:28-07 | 1.359 12768 | 2009-12-01 00:50:33-07 | 636588 13192 | 2009-12-01 00:50:34-07 | 1.401 . . . . . . . . .
有些时候,你会得到记录看起来像:
12292 | 2009-12-01 00:50:04-07 | 2270 12282 | 2009-12-01 00:50:04-07 | 93774 12192 | 2009-12-01 00:50:04-07 | 9386 12609 | 2009-12-01 00:50:05-07 | 0 12566 | 2009-12-01 00:50:08-07 | 0 12659 | 2009-12-01 00:50:19-07 | 540 * 12659 | 2009-12-01 00:50:45-07 | 541 * 12660 | 2009-12-01 00:50:19-07 | 550 12661 | 2009-12-01 00:50:19-07 | 510 12656 | 2009-12-01 00:50:19-07 | 30240 12657 | 2009-12-01 00:50:19-07 | 14930 12658 | 2009-12-01 00:50:19-07 | 17420 11820 | 2009-12-01 00:50:26-07 | 1.38 # 11832 | 2009-12-01 00:50:28-07 | 1.359 11820 | 2009-12-01 00:50:28-07 | 1.3 # 12768 | 2009-12-01 00:50:33-07 | 636588 13192 | 2009-12-01 00:50:34-07 | 1.401 . . . . . . . . .
通知的盯着和散列线。每个都是在同一分钟内读取的,但我只需要每分钟一个值,最好是最大值。 我想:
select sensor_id, read_time, voltage
from table
where (sensor_id, read_time)
in (select sensor_id, max(read_time)
from table
group by sensor_id);
这显然是不行的,但我觉得我是在正确的轨道上?
对于那些有兴趣的最终代码如下所示:
select sensor_id, date_trunc('minute', read_time), max(voltage)
from table
group by sensor_id, date_trunc('minute', read_time)
order by date_trunc('minute', read_time);
答
你必须按该“规定”一分钟水桶要在最大值的表达式:
select sensor_id, DateHourMinuteFunction(read_time), Max(voltage)
from table
Group By sensor_id, DateHourMinuteFunction(read_time)
其中DateHourMinuteFunction(read_time)
是数据库中的一些函数或Sql表达式,它将在同一分钟内返回一个与任何read_time相同的表达式(即,它需要剥离秒值)
您的数据库可以将日期时间转换为字符串吗?如果是这样,然后至少写一个表达式,将其转换为字符串,格式为月日,年,分,秒,然后剥离秒部分...
假设你已经在datetime列是一个字符串,就用字符串就可以了...
select sensor_id, SubString(Cast(read_time as varChar(22)), 0, 16), Max(voltage)
from table
Group By sensor_id, SubString(Cast(read_time as varChar(22)), 0, 16)
答
我用MS SQL,而不是Oracle的大部分工作,所以我不知道所有的Oracle日期函数关闭顶部我的头。你基本上想要做的是加入到一张表格中,该表格的开始和结束时间分解了你的分钟。它可以作为一种子查询来实时生成,也可以在数据库中包含所有范围的永久表。然后代码工作出这样的事:
SELECT
T.sensor_id,
DR.start_time AS read_time_minute,
MAX(T.voltage) AS voltage
FROM
Date_Ranges DR
INNER JOIN My_Table T ON
T.read_time BETWEEN DR.start_time AND DR.end_time
WHERE
DR.start_time >= <report start time> AND
DR.start_time < <report end time>
如果你想包括其中没有采取任何测量,然后改变INNER JOIN到LEFT OUTER JOIN倍。开始和结束时间将类似于 '2009-12-14 00:00:00', '00:02:00 2009-12-14'
答
喜欢的东西
SELECT sensor_id, date_trunc('minute',time), max(voltage)
FROM t
GROUP BY sensor_id, date_trunc('minute',time)
可能是什么您正在寻找?
您的函数DateHourMinuteFunction()已经存在我相信 - 它被称为date_trunc()。 – 2009-12-14 20:40:18
OP是否指定了特定的数据库?我错过了... – 2009-12-14 20:54:34