SQL - 指定中断参数时计数值在列中中断

SQL - count value breaks in a column when specifying break parameters

这建立在我之前的一个问题 的基础上。

我有一个 table 可以跟踪一段时间(天)内两个人(姓名)的服务参与度(srvc_invl)。

name  day  srvc_inv
Liam  1  1
Liam  2  0
Liam  3  1
Liam  4  0
Liam  5  0 
Liam  6  1
Liam  7  0
Noel  1  0
Noel  2  0
Noel  3  1
Noel  4  0
Noel  5  1
Noel  6  1
Noel  7  1

我的目标是计算每个人参与的独特服务的次数。以前,我们通过使用滞后函数计算服务参与 1 和 0 中的中断来完成此操作:

select name, count(*)
from (select t.*,
             lag(srvc_inv, 1, 0) over (partition by name order by day) as prev_srvc_inv
      from t
     ) t
where prev_srvc_inv = 0 and srvc_inv = 1
group by name;

但是,我刚刚发现服务参与中断可以根据感兴趣的程序进行不同的定义。 IE。对于某些程序,一天的非连续服务算作休息,例如:

day  srvc_inv
1  1
2  0
3  1

= 2 集服务

但对于其他项目,两天或更多天的非连续服务算作休息,例如:

day  srvc_inv
1  1
2  0
3  1

= 1 集服务,但

day  srvc_inv
1  1
2  0
3  0
4  1
5  0

= 2 集服务

使用此 post 顶部的 table,假设我们正在分析一个考虑 两天非连续服务参与的程序 成为服务中断,从而成为一个独特的服务插曲。

我将如何修改上述查询或编写一个新查询以允许我指定中断号参数?

我想要的输出如下:

name  srvc_episodes
Liam  2
Noel  1

非常感谢您提供的任何帮助!

试试这个:

SELECT NAME, 
SUM(CASE WHEN SRVC_INV = 1
AND (LAG1 = 1 OR LAG2 = 1 OR (LAG1 IS NULL AND LAG2 IS NULL)) 
THEN 1
ELSE 0
END) AS SERVICE_EPISODES
FROM
(SELECT NAME, SRVC_INV,
LAG(SRVC_INV,1) OVER (PARTITION BY NAME ORDER BY DAY) AS LAG1,
LAG(SRVC_INV,2) OVER (PARTITION BY NAME ORDER BY DAY) AS LAG2
FROM T)
GROUP BY NAME

干杯!!

使用 运行 总和而不是 lag()。这为您提供了更大的灵活性:

select name, count(*) 
from (select t.*,
             sum(srvc_inc) over (partition by name
                                 order by day
                                 rows between 2 preceding and 1 preceding
                                ) as sum_srvc_inc_2
      from t
     ) t
where (sum_srvc_inc_2 = 0 or sum_srvc_inc_2 is null) and srvc_inc = 1
group by name;

您将调整拆分时间长度的“2”。