SQL-指定中断参数时列中的计数值中断
这是基于我先前的一个问题 我有一个表格,用于跟踪两个人(姓名)在一段时间(天)内的服务参与(srvc_invl) 我的目标是统计每个人参与的独特服务的数量。之前,我们通过使用滞后函数计算服务参与1和0中的中断来实现这一点:SQL-指定中断参数时列中的计数值中断,sql,oracle,gaps-and-islands,Sql,Oracle,Gaps And Islands,这是基于我先前的一个问题 我有一个表格,用于跟踪两个人(姓名)在一段时间(天)内的服务参与(srvc_invl) 我的目标是统计每个人参与的独特服务的数量。之前,我们通过使用滞后函数计算服务参与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
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;
然而,我刚刚发现,服务参与的中断可以根据感兴趣的项目进行不同的定义。即,对于某些计划,一天的非连续服务视为休息,例如:
day srvc_inv
1 1
2 0
3 1
day srvc_inv
1 1
2 0
3 1
=2次服务插曲
但对于其他项目,两天或两天以上的非连续服务视为休息,例如:
day srvc_inv
1 1
2 0
3 1
day srvc_inv
1 1
2 0
3 1
=1次服务插曲,但
day srvc_inv
1 1
2 0
3 0
4 1
5 0
=2次服务插曲
使用本文顶部的表格,假设我们正在分析一个计划,该计划认为两天的非连续服务参与是一次服务中断,因此是一次独特的服务插曲
如何修改上述查询,或编写一个新的查询,以允许我指定break number参数
我期望的输出如下:
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
干杯 试试这个:
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”。使用运行求和,而不是
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”。Hi Gordon。再次感谢你的帮助!快速提问-在where语句中,我在哪里创建sum_srvc_inc?我在queryNever的脑子里找不到这个定义。我明白了。本应为sum_srvc_inc_2为空。你是个传奇人物,戈登。非常感谢。嗨,戈登。再次感谢你的帮助!快速提问-在where语句中,我在哪里创建sum_srvc_inc?我在queryNever的脑子里找不到这个定义。我明白了。本应为sum_srvc_inc_2为空。你是个传奇人物,戈登。非常感谢。感谢Tejash-我最终使用了上面Gordon的答案,因为它允许通过一个数字转换来更改参数。我也很感激你写这篇文章:)是的,我也是从@gordon那里学到的。他是个天才怪胎。HahaThanks Tejash-我最终使用了上面Gordon的答案,因为它允许通过单个数字转换来更改参数。我也很感激你写这篇文章:)是的,我也是从@gordon那里学到的。他是个天才怪胎。哈哈