首页 > 解决方案 > 如何根据条件对 sql 上的行进行分组

问题描述

我正在使用 redshift sql 并希望将具有重叠凭证期的用户分组到一行中(显示最短开始日期和最长结束日期)

例如,如果我有这些记录,

在此处输入图像描述

我想使用红移来实现这个结果

在此处输入图像描述

解释是 tat 因为第 1 行和第 2 行有重叠的日期,我想将它们组合在一起并得到 min(Start_date) 和 max(End_Date)

我真的不知道从哪里开始。尝试使用 row_number 对它们进行分区,但似乎效果不佳。这是我尝试过的。

select 
    id, 
    start_date, 
    end_date, 
    lag(end_date, 1) over (partition by id order by start_date) as prev_end_date,
    row_number() over (partition by id, (case when prev_end_date >= start_date then 1 else 0) order by start_date) as rn
from users

有什么建议吗?谢谢好心的先生们。

标签: sqlamazon-web-servicesamazon-redshiftmetabase

解决方案


这是一种差距和孤岛问题。因为日期是任意的,所以让我建议以下方法:

  • 使用累积最大值来获取当前日期之前的最大 end_date。
  • 使用逻辑来确定何时没有总体(即新时期开始)。
  • 开始的累积总和提供了组的标识符。
  • 然后聚合。

作为 SQL:

select id, min(start_date), max(end_date)
from (select u.*,
             sum(case when prev_end_date >= start_date then 0 else 1
                 end) over (partition by id
                            order by start_date, voucher_code
                            rows between unbounded preceding and current row
                           ) as grp
      from (select u.*,
                   max(end_date) over (partition by id
                                       order by start_date, voucher_code
                                       rows between unbounded preceding and 1 preceding
                                      ) as prev_end_date                            
            from users u
           ) u
      ) u
group by id, grp;

推荐阅读