2017-09-16 44 views
0

我有一個表'在'價格'表中有成千上萬的記錄,只有四列:uid,price,unit,dt。 dt是標準格式的日期時間,如「2017-05-01 00:00:00.585」。如何查詢一段時間內每秒的最後一條記錄在postgres

我可以很容易地選擇使用

SELECT uid, price, unit from prices 
WHERE dt > '2017-05-01 00:00:00.000' 
AND dt < '2017-05-01 02:59:59.999' 

我無法理解如何選擇價格在每個第二每次最後一個記錄的時間段。 (我也需要每一秒的第一個,但我想它會是一個類似的單獨查詢)。還有一些類似的例子(here),但是當我嘗試使它們適應我的需求而產生錯誤時,它們不適用於我。

有人可以幫我解開這個螺母嗎?

回答

0

設說是有已與此命令的一個幫助生成的表:

CREATE TABLE test AS 
SELECT timestamp '2017-09-16 20:00:00' + x * interval '0.1' second As my_timestamp 
from generate_series(0,100) x 

本表包含越來越系列時間戳,每個時間戳從鄰居相差100毫秒(0.1秒) ,以便每秒鐘內有10條記錄。

|   my_timestamp | 
|------------------------| 
| 2017-09-16T20:00:00Z | 
| 2017-09-16T20:00:00.1Z | 
| 2017-09-16T20:00:00.2Z | 
| 2017-09-16T20:00:00.3Z | 
| 2017-09-16T20:00:00.4Z | 
| 2017-09-16T20:00:00.5Z | 
| 2017-09-16T20:00:00.6Z | 
| 2017-09-16T20:00:00.7Z | 
| 2017-09-16T20:00:00.8Z | 
| 2017-09-16T20:00:00.9Z | 
| 2017-09-16T20:00:01Z | 
| 2017-09-16T20:00:01.1Z | 
| 2017-09-16T20:00:01.2Z | 
| 2017-09-16T20:00:01.3Z | 
....... 

下面的查詢確定並打印在每個第二,第一和最後的時間戳:

SELECT my_timestamp, 
     CASE 
      WHEN rn1 = 1 THEN 'First' 
      WHEN rn2 = 1 THEN 'Last' 
      ELSE 'Somwhere in the middle' 
     END as Which_row_within_a_second 
FROM (
    select *, 
     row_number() over(partition by date_trunc('second', my_timestamp) 
          order by my_timestamp 
     ) rn1, 
     row_number() over(partition by date_trunc('second', my_timestamp) 
          order by my_timestamp DESC 
     ) rn2  
    from test 
) xx 
WHERE 1 IN (rn1, rn2) 
ORDER BY my_timestamp 
; 

|   my_timestamp | which_row_within_a_second | 
|------------------------|---------------------------| 
| 2017-09-16T20:00:00Z |      First | 
| 2017-09-16T20:00:00.9Z |      Last | 
| 2017-09-16T20:00:01Z |      First | 
| 2017-09-16T20:00:01.9Z |      Last | 
| 2017-09-16T20:00:02Z |      First | 
| 2017-09-16T20:00:02.9Z |      Last | 
| 2017-09-16T20:00:03Z |      First | 
| 2017-09-16T20:00:03.9Z |      Last | 
| 2017-09-16T20:00:04Z |      First | 
| 2017-09-16T20:00:04.9Z |      Last | 
| 2017-09-16T20:00:05Z |      First | 
| 2017-09-16T20:00:05.9Z |      Last | 

的工作演示,你可以找到here

+0

是的!有用!非常感謝! – uzla

相關問題