如何解决计算连续零的数量及其实例 SQL
数据如下:
Row_No ID Bal
1 01 0
2 01 0
3 01 0
4 01 10
5 01 0
6 01 0
7 01 20
8 01 0
9 02 30
10 02 0
11 02 40
12 02 10
13 02 0
14 02 25
15 02 0
16 02 0
17 02 0
实例 = 连续零的次数
count(consecutive_zeros) = 总零
对于 ID = 01:
实例:
实例 1: Row_No 1,2,3
实例 2: Row_No 5,6
计数(consecutive_zeros):
例如没有 1,我们有 3 个零
例如没有 2 w 有 2 个零
总计 = 5
Row_no 8 不被考虑,因为它后面没有连续的零
所需输出
ID instances count(consecutive_zeros)
01 2 5
02 1 3
解决方法
;为此,您可以使用lag()
和lead()
:
select id,sum(case when bal = 0 and (prev_bal = 0 or prev_bal is null) and
next_bal = 0
then 1 else 0
end) as instances,sum(case when bal = 0 and prev_bal = 0 then 1 else 0 end)
from (select t.*,lag(bal) over (partition by id order by row_no) as prev_bal,lead(bal) over (partition by id order by row_no) as next_bal
from t
) t
group by id;
您不必将此视为间隙和孤岛问题。您的两个措施非常简单:
-
instances
在值“更改”为0
并且下一个值也是0
时计数。 -
count
计算值为0
且下一个值为0
的值。
这是一种解决方案:
- 按 Row_No 为每个 ID 订单编号
- 过滤掉余额 = 0 的行;此步骤将创建孤岛和间隙,例如对于 ID #1,您有 (1,2,3),(5,6) 和 (8)
- 给岛屿编号以进行分组
- 计算拥有不止一件物品的岛屿及其大小
- 根据需要对结果进行分组
WITH cte1 AS (
SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Row_No) AS rn
FROM t
),cte2 AS (
SELECT *
FROM cte1
WHERE Bal = 0
),cte3 AS (
SELECT *,rn - ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Row_No) AS grp
FROM cte2
),cte4 AS (
SELECT ID,grp,COUNT(*) AS grp_size
FROM cte3
GROUP BY ID,grp
HAVING COUNT(*) > 1
)
SELECT ID,COUNT(*) AS instances,SUM(grp_size) AS total_size_of_groups
FROM cte4
GROUP BY ID
,
Gordin Linoff,您的回答近乎完美。但是,这将给出准确的结果:
select id,BAL_CON_ZERO_INSTANCES+ (total_zeros-BAL_CON_ZERO_DAYS) AS BAL_CON_ZERO_INSTANCES,BAL_CON_ZERO_DAYS
(
select id,sum(case when bal = 0 and (prev_bal = 0 or prev_bal is null) and (next_bal = 1 or next_bal is null)
then 1 else 0
end) as BAL_CON_ZERO_INSTANCES,sum(case when (bal = 0 and (next_bal = 0 or next_bal is null) or (bal = 0 and (prev_bal = 0 or prev_bal is null) and (next_bal = 1 or next_bal is null))) then 1 else 0 end) as BAL_CON_ZERO_DAYS,sum(case when bal = 0 then 1 else 0 end) as total_zeros
from (select t.*,bal,lead(bal) over (partition by id order by row_no) as next_bal
from t
) t
group by id;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。