id| startdate | enddate | team | score
1| 2011-09-25 | 2012-03-31 | blue | 380
1| 2012-04-01 | 2012-07-31 | blue | 147
1| 2012-08-01 | 2013-01-31 | green| 217
1| 2013-02-01 | 2015-02-28 | green| 1540
1| 2015-03-01 | 2015-09-30 | green| 300
1| 2015-10-01 | 2018-04-30 | blue | 2193
1| 2018-05-01 | 2020-12-31 | blue | 1743
1| 2023-05-01 | 2023-09-30 | blue | 159
1| 2023-10-01 | 9999-12-31 | green| *
我需要在該視圖中合并團隊相同的連續時間段,并添加分數以獲得該團隊在該期間的總分。
注意,最后一個時間幀的值是*,因為它是當前時間幀,并且該值僅在時間段結束后插入。此外,分數的所有值都是字串格式而不是整數格式。
預期輸出:
id| startdate| enddate| team| score
1| 2011-09-25| 2012-07-31| blue| 527
1| 2012-08-01| 2015-09-30| green| 2057
1| 2015-10-01| 2020-12-31| blue| 3963
1| 2023-05-01| 2023-09-30| blue| 159
1| 2023-10-01| 9999-12-31| green| *
uj5u.com熱心網友回復:
這是一個差距和孤島問題,您可以嘗試以下使用ROW_NUMBER函式為連續團隊定義組,然后使用DATEDIFF定義一個團隊中的另一個組來檢查日期是否有中斷。
WITH grps AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY startdate) -
ROW_NUMBER() OVER (PARTITION BY id, team ORDER BY startdate) grp
FROM table_name
)
SELECT id, MIN(startdate) startdate, MAX(enddate) enddate, team,
CASE WHEN MAX(score) = '*'
THEN '*'
ELSE SUM(score)
END AS score
FROM
(
SELECT *, COALESCE(DATEDIFF(startdate, LAG(enddate) OVER (PARTITION BY grp ORDER BY enddate)), 1) grp2
FROM grps
) T
GROUP BY id, team, grp, grp2
ORDER BY id, startdate
查看演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/513602.html
標籤:mysqlsqlapache-spark-sql数据块-sql
上一篇:僅當有10行或更多行時才回傳結果
