【问题标题】:SQL ranking issueSQL排名问题
【发布时间】:2021-04-06 20:52:17
【问题描述】:

我正在尝试做一些我认为很简单但正确设置它的问题(使用 Redshift)。

create temporary table tmpTest (
    guid int,
    date date,
    eligible boolean
);

insert into tmpTest
values (1,'2021-01-01',TRUE),
       (1,'2021-01-02',TRUE),
       (1,'2021-01-03',FALSE),
       (1,'2021-01-04',TRUE),
       (2,'2021-01-01',TRUE),
       (2,'2021-01-02',FALSE),
       (2,'2021-01-03',TRUE),
       (2,'2021-01-04',TRUE);

从这个表中,我希望在第 4 列中生成以下内容,该列从 1 开始,对于每个新的 guid,在最新的日期 desc 中。然后每个真/假的数字翻转,直到它到达下一个 guid 并重新开始。

guid date eligible rank
1 2021-01-01 TRUE 3
1 2021-01-02 TRUE 3
1 2021-01-03 FALSE 2
1 2021-01-04 TRUE 1
2 2021-01-01 TRUE 3
2 2021-01-02 FALSE 2
2 2021-01-03 TRUE 1
2 2021-01-04 TRUE 1

这样做的原因是拉出排名为 1 的所有行,向我显示 guid 每天连续标记为 TRUE 的最新记录。我尝试了各种配置中的 dense_rank() 无济于事......

guid date eligible rank
1 2021-01-04 TRUE 1
2 2021-01-03 TRUE 1
2 2021-01-04 TRUE 1

【问题讨论】:

  • Redshift 还是 Postgres?尽管它们有一些古老的相似之处,但它们是截然不同的产品。
  • 这是 Redshift 数据库 - 我将两者都放在以防万一,因为我不确定我要解决的问题是否存在语法差异。我遇到了一些非常不同的事情,而另一些则没有那么多。

标签: sql amazon-redshift


【解决方案1】:

使用lag()获取前一个flag,然后进行累加:

select t.*,
       sum( case when eligible = prev_eligible then 0 else 1 end) over (
            partition by guid
            order by date
            rows between unbounded preceding and current row
           ) as ranking
from (select t.*,
             lag(eligible) over (partition by guid order by date) as prev_eleigible
      from t
     ) t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多