Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-指定中断参数时列中的计数值中断_Sql_Oracle_Gaps And Islands - Fatal编程技术网

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

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

这是基于我先前的一个问题

我有一个表格,用于跟踪两个人(姓名)在一段时间(天)内的服务参与(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 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那里学到的。他是个天才怪胎。哈哈