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”。
这建立在我之前的一个问题
我有一个 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”。