将日期时间条目放入存储桶的SQL命令

问题描述 投票:0回答:3

我具有如下表结构:

timestamp
2020-03-10 04:05:44.000000
2020-03-10 04:05:44.000000
2020-03-10 04:05:44.000000
2020-03-10 04:05:44.000000
2020-03-10 07:07:44.000000
2020-03-10 07:07:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000

[每天,只有三个时间戳(时间可以不同,但​​总是三个)。我想要的是另一列,告诉我哪个时间戳是第一个,第二个和第三个时间戳,即产生如下输出:

timestamp                   timestamp_order
2020-03-10 04:05:44.000000  1
2020-03-10 04:05:44.000000  1
2020-03-10 04:05:44.000000  1
2020-03-10 04:05:44.000000  1
2020-03-10 07:07:44.000000  2
2020-03-10 07:07:44.000000  2
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3

三个存储桶中的条目数量可以不同。我已经尝试了一些RANK()或NTILE()函数,但无法获得正确的输出,因为它给了我太大的数字(等级给了我1,1,1,1,5,5,...)或假设使用相同大小的水桶。

谢谢!

sql rank
3个回答
0
投票

只需使用DENSE RANK函数,即可为您排序的分区内的排名。

SELECT timestamp, 
       DENSE_RANK( ) OVER( ORDER BY timestamp ASC ) timestamp_order
FROM #TABLE_Name;

0
投票

您需要具有分区的DENSE_RANK

SELECT timestamp
     , DENSE_RANK() OVER(PARTITION BY CAST(timestamp AS DATE) ORDER BY timestamp) AS timestamp_order
FROM t

0
投票

不确定它是否适用于所有dbms(至少在Postgres中有效),但是您可以尝试:

SELECT 
    timestamp, 
    DENSE_RANK() OVER(PATITION BY date_trunc('day', timestamp) 
                       ORDER BY timestamp) as timestamp_order
FROM table

date_trunc从您的时间戳记中提取日期,排名给您]

© www.soinside.com 2019 - 2024. All rights reserved.