【问题标题】:Check if a value is the next or previous day in SQL检查一个值是 SQL 中的第二天还是前一天
【发布时间】:2020-03-09 21:28:19
【问题描述】:

我正在尝试计算一天中的第二天或前一天有多少次在当天具有特定值时具有特定值。 (我简化了数据库结构,让你更好地理解我需要什么) 示例:

Date          Event
2015-01-01       x
2015-01-02       x
2015-01-03      rest
2015-01-04      sick
2015-01-05       x
2015-01-06      sick
2015-01-07      rest
2015-01-08       x
2015-01-09       x

我需要计算一个人在休息日之后或之前生病了多少天。 在这种情况下,查询的结果应该是:2

【问题讨论】:

  • 答案是否为 2,因为有 2 个休息日,这两个休息日都有符合条件的病假?或者是 2 是因为在您的样本中的时间段内,有 2 个符合条件的病假?请注意如何构建测试数据以验证您的逻辑。
  • @SM或者答案是2,因为休息日前后有2个病假,我需要知道病假是在休息日之前还是之后才能找到想要的人休息两天,而不是假装生病,数一数他们这样做了多少次

标签: sql sql-server database


【解决方案1】:

您可以使用'rest' 的累积总和来获取组。然后聚合过滤:

select count(*)
from (select t.*,
             sum(case when event = 'rest' then 1 else 0 end) over (order by date) as rest_grp
      from t
     ) t
where state = 'sick' 
group by rest_grp;

这实际上返回三行——因为有三个组(在其余组之前、中间和最后一个之后)。

如果你特别想要中间组,那么使用:

where state = 'sick' and rest_grp = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多