SQL 将日期时间条目放入桶中的命令
SQL command to put datetime entries into buckets
我有一个table结构如下:
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,...)或假设大小相同的桶。
谢谢!
只需使用 DENSE RANK 函数即可在您的有序分区内进行排名。
SELECT timestamp,
DENSE_RANK( ) OVER( ORDER BY timestamp ASC ) timestamp_order
FROM #TABLE_Name;
您需要 DENSE_RANK
分区:
SELECT timestamp
, DENSE_RANK() OVER(PARTITION BY CAST(timestamp AS DATE) ORDER BY timestamp) AS timestamp_order
FROM t
不确定它是否适用于所有 dbms(至少在 Postgres 中有效),但您可以尝试:
SELECT
timestamp,
DENSE_RANK() OVER(PATITION BY date_trunc('day', timestamp)
ORDER BY timestamp) as timestamp_order
FROM table
date_trunc
从您的时间戳中提取日期,排名为您提供
我有一个table结构如下:
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,...)或假设大小相同的桶。
谢谢!
只需使用 DENSE RANK 函数即可在您的有序分区内进行排名。
SELECT timestamp,
DENSE_RANK( ) OVER( ORDER BY timestamp ASC ) timestamp_order
FROM #TABLE_Name;
您需要 DENSE_RANK
分区:
SELECT timestamp
, DENSE_RANK() OVER(PARTITION BY CAST(timestamp AS DATE) ORDER BY timestamp) AS timestamp_order
FROM t
不确定它是否适用于所有 dbms(至少在 Postgres 中有效),但您可以尝试:
SELECT
timestamp,
DENSE_RANK() OVER(PATITION BY date_trunc('day', timestamp)
ORDER BY timestamp) as timestamp_order
FROM table
date_trunc
从您的时间戳中提取日期,排名为您提供