簡體   English   中英

SQL - 在多列上聚合

[英]SQL - Aggregate on multiple columns

我有一個問題,我是 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

假設您的日期列是一個適當的可排序日期而不是文本,那么我們可以將其視為一個空白和孤島問題。 我們可以使用行號不同的方法。

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);

如果我正確理解了問題並且您想為每個Name制作成對的日期,則可以選擇以下語句:

測試數據:

SELECT *
INTO Data
FROM (VALUES
   ('x', CONVERT(date, 'Jan 01 2022', 106)),    
   ('y', CONVERT(date, 'Feb 01 2022', 106)),
   ('z', CONVERT(date, 'Mar 01 2022', 106)),
   ('x', CONVERT(date, 'Jan 02 2022', 106)),
   ('y', CONVERT(date, 'Feb 02 2022', 106)),
   ('z', CONVERT(date, 'Mar 02 2022', 106)),
   ('x', CONVERT(date, 'Jan 03 2022', 106)),
   ('y', CONVERT(date, 'Feb 03 2022', 106)),
   ('z', CONVERT(date, 'Mar 03 2022', 106)),
   ('x', CONVERT(date, 'Jan 04 2022', 106)),
   ('y', CONVERT(date, 'Feb 04 2022', 106)),
   ('z', CONVERT(date, 'Mar 04 2022', 106)),
   ('x', CONVERT(date, 'Jan 05 2022', 106)),
   ('y', CONVERT(date, 'Feb 05 2022', 106)),
   ('z', CONVERT(date, 'Mar 05 2022', 106))
) v (Name, Date)

陳述:

SELECT 
   Name, 
   StartDate = MIN(CASE WHEN (Rn - 1) % 2 = 0 THEN Date END),
   EndDate   = MAX(CASE WHEN (Rn - 1) % 2 = 1 THEN Date END)
FROM (  
   SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Date) AS Rn
   FROM Data
) t
GROUP BY Name, ((Rn - 1) / 2)
ORDER BY Name

結果:

名稱 開始日期 結束日期
X 2022-01-01 2022-01-02
X 2022-01-03 2022-01-04
X 2022-01-05 null
2022-02-01 2022-02-02
2022-02-03 2022-02-04
2022-02-05 null
z 2022-03-01 2022-03-02
z 2022-03-03 2022-03-04
z 2022-03-05 null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM