2009-12-14 49 views
1

給定一個表,看起來像這樣: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); 

回答

1

你必須按該「規定」一分鐘水桶要在最大值的表達式:

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

0

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

2

喜歡的東西

SELECT sensor_id, date_trunc('minute',time), max(voltage) 
FROM t 
GROUP BY sensor_id, date_trunc('minute',time) 

可能是什麼您正在尋找?