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

连续计算SQL Server天数

甄文彬
2023-03-14
问题内容

我希望为每个人计算连续的一天咒语。

我的表:

CREATE TABLE Absence(
Date Date,
Code varchar(10),
Name varchar(10),
Type varchar(10)
);

INSERT INTO Absence (Date, Code, Name, Type)
VALUES ('01-10-18', 'S', 'Sam', 'Sick'),
('01-11-18','S', 'Sam', 'Sick'),
('01-12-18','S', 'Sam', 'Sick'),
('01-21-18','S', 'Sam', 'Sick'),
('01-26-18','S', 'Sam', 'Sick'),
('01-27-18','S', 'Sam', 'Sick'),
('02-12-18','S', 'Sam', 'Holiday'),
('02-13-18','S', 'Sam', 'Holiday'),
('02-18-18','S', 'Sam', 'Holiday'),
('02-25-18','S', 'Sam', 'Holiday'),
('02-10-18','S', 'Sam', 'Holiday'),
('02-13-18','F', 'Fred', 'Sick'),
('02-14-18','F', 'Fred', 'Sick'),
('02-17-18','F', 'Fred', 'Sick'),
('02-25-18','F', 'Fred', 'Sick'),
('02-28-18','F', 'Fred', 'Sick');

这是我目前拥有的代码:

WITH CTE AS
(
SELECT 
Date,
Name, 
Type
,GroupingSet = DATEADD(DAY, ROW_NUMBER() OVER 
(PARTITION BY [Name], [Type] ORDER BY [Date]), [Date])
FROM Absence
)
SELECT 
    Name,
    StartDate = MIN(Date),
    EndDate = MAX(Date),
    Result = COUNT(Name),
    min(Type) AS [Type]
    FROM CTE

   GROUP BY Name, GroupingSet
    -- HAVING COUNT(NULLIF(Code, 0)) > 1
   ORDER BY Name, StartDate

产生结果:

| Name |  StartDate |    EndDate | Result |    Type |
|------|------------|------------|--------|---------|
| Fred | 2018-02-13 | 2018-02-13 |      1 |    Sick |
| Fred | 2018-02-14 | 2018-02-14 |      1 |    Sick |
| Fred | 2018-02-17 | 2018-02-17 |      1 |    Sick |
| Fred | 2018-02-25 | 2018-02-25 |      1 |    Sick |
| Fred | 2018-02-26 | 2018-02-28 |      1 |    Sick |
|  Sam | 2018-01-10 | 2018-01-10 |      1 |    Sick |
|  Sam | 2018-01-11 | 2018-01-11 |      1 |    Sick |
|  Sam | 2018-01-12 | 2018-01-12 |      1 |    Sick |
|  Sam | 2018-01-21 | 2018-01-21 |      1 |    Sick |
|  Sam | 2018-01-26 | 2018-01-26 |      1 |    Sick |
|  Sam | 2018-01-27 | 2018-01-27 |      1 |    Sick |
|  Sam | 2018-02-10 | 2018-02-10 |      1 | Holiday |
|  Sam | 2018-02-12 | 2018-02-12 |      1 | Holiday |
|  Sam | 2018-02-13 | 2018-02-13 |      1 | Holiday |
|  Sam | 2018-02-18 | 2018-02-18 |      1 | Holiday |
|  Sam | 2018-02-25 | 2018-02-25 |      1 | Holiday |

在我正在寻找这样的结果集的地方:

| Name |       Date | Result  |    Type |
|------|------------|---------|---------|
| Fred | 2018-02-13 |       2 |    Sick |
|  Sam | 2018-01-27 |       2 |    Sick |
|  Sam | 2018-02-10 |       1 | Holiday |

我需要计算连续1天以上的连续天数。然后将其作为某人拥有多少个连续咒语的总和。例如,弗雷德在这段时间内连续2次生病。如果某人有星期五和星期一休息,我也需要此内容,这应该算作一个连续的咒语。

我对如何到达那里有些迷失。任何帮助将不胜感激。

请参阅:http
://sqlfiddle.com/#!18/88612/16


问题答案:

您可以使用以下方式获取缺勤时间:

select name, min(date), max(date), count(*) as numdays, type
from (select a.*,
             row_number() over (partition by name, type order by date) as seqnum_ct
      from absence a
     ) a
group by name, type, dateadd(day, -seqnum_ct, date);

这是为此的SQL Fiddle。

您可以添加having count(*) > 1以获取一天或更长的期间。这似乎很有用。我不明白最终的输出是什么。该描述对我而言毫无意义。

如果您希望缺勤的天数为2天或以上,则可以将其用作子查询/ CTE:

select name, count(*), type
from (select name, min(date) as mindate, max(date) as maxdate, count(*) as numdays, type
      from (select a.*,
                   row_number() over (partition by name, type order by date) as seqnum_ct
            from absence a
           ) a
      group by name, type, dateadd(day, -seqnum_ct, date)
     ) b
where numdays > 1
group by name, type;


 类似资料:
  • 问题内容: 有没有一种方法可以获取表示行中NULL字段数的列?这将在SELECT语句中。 例如: 更新:我想要此查询,以便我可以基于给定书的有多少会员销售进行排序。因此,无论哪个会员,拥有3个会员的排名都会比拥有2个会员的排名高。我的数据库中大约有七个会员,并且会不断增长。因此,任何要求指定每个会员字段的查询都可能太长 桌子: Affiliates_Cache- 主键是Affiliate_ISBN

  • 问题内容: 如何在Python中计算连续字符,以查看每个唯一数字在下一个唯一数字之前重复的次数? 起初,我以为我可以做类似的事情: 这样,我就可以看到每个唯一数字重复的次数。但是,这当然会在达到最后一个值时超出范围。 在上面的示例中,我希望Python告诉我1重复1,而0重复3次。但是,由于我的while语句,上面的代码失败了。 我知道您可以使用内置函数来做到这一点,并且希望采用这种方式的解决方案

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

  • 问题内容: 感谢Mike提出的添加创建/插入语句的建议。 我想添加一个新列,即“当前条纹天数”,因此 结果 如下所示: 但我不知道如何将技巧与其他窗口功能结合使用以获取正确的结果。 问题答案: 在此表上构建(不使用SQL关键字“ date”作为列名。): 询问: 从另一个减去a得到一个。由于您一直在寻找连续的日子,因此下一行将增加 一 。如果从中减去,则整个条纹最终将归入同一组()。然后,很容易按

  • 问题内容: 假设我在numpy数组中有一堆数字,并且根据返回布尔数组的条件对它们进行了测试: 并使用此布尔数组,我想计算True连续出现的所有长度。例如,如果我有,我想回去。 我可以使用以下代码来做到这一点: 但是是否已经为此或python,numpy,scipy等函数实现了任何功能,该函数计算给定输入在列表或数组中连续出现的长度? 问题答案: 这是使用的解决方案(可能不是最快的解决方案):

  • 我在Postgres数据库中有一个查询,它结合了客户端订阅。 我想添加一个称为“连续月份”的变量,但我不确定在Postgres中如何添加。 我的原始桌子是这样的: 我希望有一个连续数月的东西,比如: 谢谢你在先进的帮助!