【问题标题】:SQL - Aggregate on multiple columnsSQL - 聚合多列
【发布时间】:2023-01-19 15:44:09
【问题描述】:

我有一个问题,我是 SQL 的新手,所以我不确定如何解决它。我有一个包含两列的表,我想从最早的日期开始,并将下一次出现的(名称列)作为结束日期。

我知道我想按名称分组,但我不确定之后该怎么做:

 Name     Date
  x      Jan-01    
  y      Feb-01
  z      Mar-01
  x      Jan-02
  y      Feb-02
  z      Mar-02
  x      Jan-03
  y      Feb-03
  z      Mar-03
  x      Jan-04
  y      Feb-04
  z      Mar-04
  x      Jan-05
  y      Feb-05
  z      Mar-05

我希望结果表看起来像这样:

 Name DateStart DateEnd
  x    Jan-01    Jan-02
  y    Feb-01    Feb-02
  z    Mar-01    Mar-02
  x    Jan-03    Jan-04
  y    Feb-03     Feb-04
  z    Mar-03     Mar-04
  x    Jan-05     NULL
  y    Feb-05     NULL       
  z    Mar-05     NULL

【问题讨论】:

    标签: sql sql-server ssms


    【解决方案1】:

    假设您的日期列是一个适当的可排序日期而不是文本,那么我们可以将其视为一个空白和孤岛问题。我们可以使用行号不同的方法。

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (ORDER BY Date) rn1,
                  ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Date) rn2
        FROM yourTable
    )
    
    SELECT Name, MIN(Date) AS DateStart, MAX(Date) AS DateEnd
    FROM cte
    GROUP BY Name, rn1 - rn2
    ORDER BY MIN(Date);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      相关资源
      最近更新 更多