【问题标题】:SQL command to put datetime entries into buckets将日期时间条目放入存储桶的 SQL 命令
【发布时间】:2020-03-10 06:02:39
【问题描述】:

我的表结构如下:

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 它应该会给你所需的输出
  • .....标记数据库

标签: sql rank


【解决方案1】:

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

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

date_trunc 从您的时间戳中提取日期,排名为您提供

【讨论】:

    【解决方案2】:

    你需要DENSE_RANK带分区:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-06
        • 2021-12-08
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        相关资源
        最近更新 更多