我已经试着解决一个问题好几天了,但就是解决不了.因此我今天的问题.

PersonID Visit_date Medication_intake Previous_date Date_diff Running_sum
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

这是我想要的结果.因此,只需计算连续区块的运行总和(药物摄入=1).

PersonID Visit_date Medication_intake Previous_date Date_diff Running_sum
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合作.

非常感谢你的建议!

推荐答案

这是一个缺口和孤岛问题,一种方法使用行数差异法:

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的记录岛计算日期差异的滚动和.对于其他记录,或date diff为null的记录,生成的值仅为null.

Sql相关问答推荐

如何在T—SQL中找到值更改之前的日期?

使用交叉应用透视表在SQL中转换分段时间段&

没有循环的SQL更新多个XML node 值

当一个视图在Postgres中失效时?

如何从JSON数组中 Select 多个值

OVER子句WITH PARTITION BY和ORDER BY忽略主查询的WHERE子句

获得第三名或最老的记录

根据最大值为字母数字大小写分配数值

根据时间、状态和相关行在PostgreSQL中的存在来删除行

从重复值中获取最新值

向表中添加新列取决于表的日期列(unpivot)

获取主表条目,其中最新的辅助条目是 6 个月前

用替代方案替换 SQL Cursor 以提高性能

确定小数中使用的精度位数

Postgres,使用 select 插入多个值

创建具有多个子查询的 SQL 视图

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

SQLite 中的过滤运行总和视图

如何从 2 个 SQLite 表构建嵌套对象?

连接表时避免重复