当前位置: 首页 > 面试题库 >

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

曾景龙
2023-03-14
问题内容

假设我在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,可疑为3),其中由几天内中断活动。

要参与 任何 服务,我将使用以下查询

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

谢谢你的帮助!


问题答案:

我建议使用lag()。这个想法是要计算一个“ 1”,但仅当前一个值为零或时null

select name, count(*)
from (select t.*,
             lag(srvc_inv) over (partition by name order by day) as prev_srvc_inv
      from t
     ) t
where (prev_srvc_inv is null or prev_srvc_inv = 0) and
      srvc_inv = 1
group by name;

您可以通过使用默认值来稍微简化一下lag()

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;


 类似资料:
  • 问题内容: 我希望为每个人计算连续的一天咒语。 我的表: 这是我目前拥有的代码: 产生结果: 在我正在寻找这样的结果集的地方: 我需要计算连续1天以上的连续天数。然后将其作为某人拥有多少个连续咒语的总和。例如,弗雷德在这段时间内连续2次生病。如果某人有星期五和星期一休息,我也需要此内容,这应该算作一个连续的咒语。 我对如何到达那里有些迷失。任何帮助将不胜感激。 请参阅:http ://sqlfid

  • 问题内容: 我正在尝试计算股票收益数据中连续上升的天数- 因此,如果正数日为1,负数为0,则应该返回一个列表。 我来到了一个解决方案,它在代码行数方面很整洁,但是 非常 慢: 我猜想我遍历整个列表太多次了。是否有一种很好的Pythonic方式可以实现我想要的,而只需要遍历一次数据?我可以自己编写一个循环,但想知道是否有更好的方法。 谢谢! 问题答案: 为什么痴迷于超pythonic的做事方式?可读

  • 我被困在一个问题上,希望得到一些指导。我们希望生成一个报告,计算产品的连续日期(从用户提供的日期向后看)。数据集如下: 因此,我们想得出一份报告,该报告在2021年3月2日提供的日期如下所示: 尽管我正在努力编写查询,但我甚至不知道该怎么称呼它,因为我需要一个特定阈值上的连续值计数。我可以计算阈值以上的值,但不确定如何添加“连续数周”逻辑。

  • 我想在一个名为的表中计算名为的同一列: 假设我需要在20180201和20180228之间计算“(值的类型=111或222或333)/(值的类型=444)”,我使用SQL查询如下: 我只选择了备注=“111或222或333”,我不知道为什么会出现所有备注(“555和666”),我得到的结果如下: SQL查询正确吗?我确信我的SQL查询有问题。非常感谢您的建议。

  • 问题内容: 这个问题已经在这里有了答案 : 列数 (5个答案) 6年前关闭。 如何使用SQL计算表中的列数? 我正在使用Oracle 11g 请帮忙。t。 问题答案: 可以使用低位函数代替大写。例如:从user_tab_columns中选择count(*),其中lower(table_name)=’table_name’;

  • 问题内容: 我正在尝试创建一个列(“ consec”),该列将连续计数另一个(“二进制”)中的连续值,而不使用循环。这是预期的结果: 但是这个 导致… 我看到了其他使用分组或排序的帖子,但不幸的是,我看不到如何对我有用。在此先感谢您的帮助。 问题答案: 您可以使用compare-cumsum-groupby模式(我 确实 需要解决这个问题才能编写文档),最后是: 之所以有效,是因为首先我们得到了要