如何在postgres中查询一段时间内每秒的最后一条记录

时间:2017-09-16 17:59:35

标签: postgresql

我的桌子上有数以亿计的价格和价格记录。只有四列的表:uid,price,unit,dt。 dt是标准格式的日期时间,例如' 2017-05-01 00:00:00.585'。

我可以很容易地使用

选择一个句号
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),但当我尝试根据我的需要调整错误时,它们对我不起作用。

有些人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

假设有一个表格是借助此命令生成的:

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

的工作演示