【问题标题】:How to get the latest non-negative value in SQL?如何在 SQL 中获取最新的非负值?
【发布时间】:2021-11-06 01:55:07
【问题描述】:

我有以下数据集。

date orig dest value
11-4 S8 B9 -42
10-30 S8 B9 -2999
10-15 S8 B9 959
10-14 S8 B9 480
10-13 S8 B9 0
10-9 S8 B9 503

我怎样才能把它变成这样的东西?

date orig dest value new value
11-4 S8 B9 -42 959
10-30 S8 B9 -2999 959
10-15 S8 B9 959 959
10-14 S8 B9 480 480
10-13 S8 B9 0 503
10-9 S8 B9 503 503

这是我用过的,不正确:

CASE WHEN value <= 0
     THEN last_value(value) over (PARTITION BY orig, dest ORDER BY date DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
     ELSE value 
END as new_value

这里的目标是不要用最近的最大值替换

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift window-functions


    【解决方案1】:

    这应该在 Redshift 中完成:

    SELECT date, orig, dest, value
         , max(value) OVER (PARTITION BY orig, dest, grp) AS new_value
    FROM  (
       SELECT date, orig, dest, value
            , count(value > 0 OR NULL) OVER (PARTITION BY orig, dest ORDER BY date) AS grp
       FROM   tbl
       ) sub
    

    解释:

    关于count(expression OR NULL),见:

    不幸的是,Redshift 没有跟上对 Postgres 的改进,并且缺少聚合的 FILTER 子句(自 Postgres 9.4 起!),这会更快、更优雅:

    SELECT date, orig, dest, value
         , max(value) OVER (PARTITION BY orig, dest, grp) AS new_value
    FROM  (
       SELECT date, orig, dest, value
            , count(*) FILTER (WHERE value > 0) OVER (PARTITION BY orig, dest ORDER BY date) AS grp
       FROM   tbl
       ) sub
    

    见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-09
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多