gpt4 book ai didi

sql - 如何使用 SQL 计算列中非连续值的数量?

转载 作者:行者123 更新时间:2023-12-01 10:18:51 25 4
gpt4 key购买 nike

跟进我的问题 here .假设我在 Oracle 数据库中有一个表,如下所示 (table_1),它跟踪特定个人的服务参与情况:

name  day  srvc_ inv
bill 1 1
bill 2 1
bill 3 0
bill 4 0
bill 5 1
bill 6 0
susy 1 1
susy 2 0
susy 3 1
susy 4 0
susy 5 1

我的目标是得到一个汇总表,其中列出了所有独特的个人是否有服务参与和不同服务事件的数量(在本例中为 2 个 bill,3 个为 susy),其中一个不同的服务事件是由连续几天的事件中断确定。

要获取任何服务参与,我会使用以下查询

SELECT table_1."Name", MAX(table_1."Name") AS "any_invl"
FROM table_1
GROUP BY table_1."Name"

但是,我对如何获得服务参与次数 (2) 感到困惑。在 R 中使用静态数据帧,您将使用运行长度编码(请参阅我的原始问题),但我不知道如何在 SQL 中完成此操作。此操作将在大量记录上运行,因此将整个数据帧存储为一个对象然后在 R 中运行它是不切实际的。

编辑:我期望的输出如下:

name  any_invl  n_srvc_inv
bill 1 2
susy 1 3

感谢您的帮助!

最佳答案

是这样的吗?

SQL> with test (name, day, srvc_inv) as
2 (select 'bill', 1, 1 from dual union all
3 select 'bill', 2, 1 from dual union all
4 select 'bill', 3, 0 from dual union all
5 select 'bill', 4, 0 from dual union all
6 select 'bill', 5, 1 from dual union all
7 select 'bill', 6, 0 from dual union all
8 select 'susy', 1, 1 from dual union all
9 select 'susy', 2, 0 from dual union all
10 select 'susy', 3, 1 from dual union all
11 select 'susy', 4, 0 from dual union all
12 select 'susy', 5, 1 from dual
13 ),
14 inter as
15 (select name, day, srvc_inv,
16 nvl(lead(srvc_inv) over (partition by name order by day), 0) lsrvc
17 from test
18 )
19 select name,
20 sum(case when srvc_inv <> lsrvc and lsrvc = 0 then 1
21 else 0
22 end) grp
23 from inter
24 group by name;

NAME GRP
---- ----------
bill 2
susy 3

SQL>

关于sql - 如何使用 SQL 计算列中非连续值的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57740645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com