幾天來我一直在嘗試解決一個問題,但我就是無法解決它。因此我今天的問題。我想計算下表中的運行總和。到目前為止,我的結果如下所示:
| 個人ID | 訪問日期 | 藥物攝入 | Previous_date | 日期差異 | 運行總和 |
|---|---|---|---|---|---|
| 1 | 2012-04-26 | 1 | |||
| 1 | 2012-11-16 | 1 | 2012-04-26 | 204 | 204 |
| 1 | 2013-04-11 | 0 | |||
| 1 | 2013-07-19 | 1 | |||
| 1 | 2013-12-05 | 1 | 2013-07-19 | 139 | 343 |
| 1 | 2014-03-18 | 1 | 2013-12-05 | 103 | 585 |
| 1 | 2014-06-24 | 0 | |||
| 2 | 2014-12-01 | 1 | |||
| 2 | 2015-03-09 | 1 | 2014-12-01 | 98 | 98 |
| 2 | 2015-09-28 | 0 |
這是我想要的結果。因此,只應計算連續塊 (Medication_intake=1) 上的運行總和。
| 個人ID | 訪問日期 | 藥物攝入 | Previous_date | 日期差異 | 運行總和 |
|---|---|---|---|---|---|
| 1 | 2012-04-26 | 1 | |||
| 1 | 2012-11-16 | 1 | 2012-04-26 | 204 | 204 |
| 1 | 2013-04-11 | 0 | |||
| 1 | 2013-07-19 | 1 | |||
| 1 | 2013-12-05 | 1 | 2013-07-19 | 139 | 139 |
| 1 | 2014-03-18 | 1 | 2013-12-05 | 103 | 242 |
| 1 | 2014-06-24 | 0 | |||
| 2 | 2014-12-01 | 1 | |||
| 2 | 2015-03-09 | 1 | 2014-12-01 | 98 | 98 |
| 2 | 2015-09-28 | 0 |
我使用 Microsoft SQL Server 2019 Express。
非常感謝您的提示!
uj5u.com熱心網友回復:
這是一個間隙和孤島問題,一種方法使用行數差異法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY PersonID
ORDER BY Visit_date) rn1,
ROW_NUMBER() OVER (PARTITION BY PersonId, Medication_intake
ORDER BY Visit_date) rn2
FROM yourTable
)
SELECT PersonID, Visit_date, Medication_intake, Previous_date, Date_diff,
CASE WHEN Date_diff IS NOT NULL AND Medication_intake = 1
THEN SUM(Date_diff) OVER (PARTITION BY PersonID, rn1 - rn2
ORDER BY Visit_date) END AS Running_sum
FROM cte
ORDER BY PersonID, Visit_date;
演示
外部查詢中的CASE運算式計算沿藥物攝入值為 1 的記錄島的日期差異的滾動總和。對于其他記錄,或日期差異為空的記錄,生成的值只是空的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441791.html
上一篇:如何在SQL中按年按月排列輸出?
