【问题标题】:Incrementing row numbers by condition in postgres在postgres中按条件增加行号
【发布时间】:2021-02-03 06:36:15
【问题描述】:

我有一个带有时间戳的 postgres 表,以及 difftime 中当前和上一个(滞后)时间戳之间的四舍五入小时差

 timestamp               type    difftime
 2013-09-14 14:19:46     JPR03   2 
 2013-09-14 15:11:48     JPR03   1 
 2013-09-14 16:11:49     JPR03   1 
 2013-09-14 17:13:45     JPR03   1 
 2013-09-22 00:08:38     JPR03   175 
 2013-09-22 00:10:11     JPR03   0 
 2013-09-22 01:11:36     JPR03   1 
 2013-09-22 02:16:11     JPR03   1 
 2013-09-22 03:13:16     JPR03   1 
 2013-09-22 04:05:38     JPR03   1 
 2013-09-22 06:10:11     JPR03   2 
 2013-09-22 07:26:43     JPR03   1 
 2013-09-22 08:17:35     JPR03   1 
 2013-09-22 09:16:08     JPR03   1 
 2013-09-22 10:16:08     JPR03   1 
 2013-10-01 06:15:07     JPR03   212 
 2013-10-01 06:15:12     JPR03   0 
 2013-10-02 07:15:15     JPR03   25 
 2013-10-02 08:05:09     JPR03   1 

我的目标是创建一个递增的行号序列,当且仅当difftime 中的值高于某个阈值x(按时间排序)时才增加1。如果 x = 5,那么输出将如下所示:

 timestamp               type    difftime  rownum
 2013-09-14 14:19:46     JPR03   2         0
 2013-09-14 15:11:48     JPR03   1         0
 2013-09-14 16:11:49     JPR03   1         0
 2013-09-14 17:13:45     JPR03   1         0
 2013-09-22 00:08:38     JPR03   175       1
 2013-09-22 00:10:11     JPR03   0         1
 2013-09-22 01:11:36     JPR03   1         1
 2013-09-22 02:16:11     JPR03   1         1
 2013-09-22 03:13:16     JPR03   1         1
 2013-09-22 04:05:38     JPR03   1         1
 2013-09-22 06:10:11     JPR03   2         1
 2013-09-22 07:26:43     JPR03   1         1
 2013-09-22 08:17:35     JPR03   1         1
 2013-09-22 09:16:08     JPR03   1         1
 2013-09-22 10:16:08     JPR03   1         1
 2013-10-01 06:15:07     JPR03   212       2
 2013-10-01 06:15:12     JPR03   0         2
 2013-10-02 07:15:15     JPR03   25        3
 2013-10-02 08:05:09     JPR03   1         3

我熟悉RANK()DENSE_RANK()ROW_NUMBER()COALESCE() 函数,但这些函数都不能实现按条件(从 0 开始)递增行号的目标。关于如何实现这种变量赋值或这里可以应用哪些函数来基于条件进行分区的任何建议?

【问题讨论】:

  • 是上一行的条件还是自上次满足条件后的第一行的条件?
  • 自上次满足条件以来的第一个,因此新值将在满足条件的同一记录上“开始”

标签: sql postgresql row-number run-length-encoding


【解决方案1】:

demo:db<>fiddle

您可以使用带有条件值的累积SUM()函数:如果满足条件,则添加1,否则添加0

SELECT
    *,
    SUM(
        CASE 
            WHEN diff >= 5 THEN 1
            ELSE 0
        END
    ) OVER (ORDER BY ts)
FROM --<your query>

【讨论】:

    【解决方案2】:

    在 Postgres 中,我建议使用 filter:

    select q.*,
           count(*) filter (where diff > ?) over (order by ts) as rownum
    from <your query> q;
    

    ? 是一个占位符,表示您想到的任何值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多