PSQL选择每分钟每个ID的最大值,每个ID每分钟多个值?

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) 
+0

您的函数DateHourMinuteFunction()已经存在我相信 - 它被称为date_trunc()。 – 2009-12-14 20:40:18

+0

OP是否指定了特定的数据库?我错过了... – 2009-12-14 20:54:34

我用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) 

可能是什么您正在寻找?