获取每个组和序列的开始和结束日期,由一个日期列得出

杰森

我有以下数据:

DECLARE @tbl TABLE (
ID VARCHAR(8)
,WeekDayName VARCHAR(15)
,StartDate VARCHAR(15)
,EndDate VARCHAR(15)
,A_Type VARCHAR(3)
,A_Days VARCHAR(10)
,A_Hours VARCHAR(10)
)
INSERT INTO @tbl (ID, WeekDayName, StartDate, EndDate, A_Type, A_Days, A_Hours)
VALUES
('150017', 'Monday', '2019-12-23', '2019-12-23', '430', 1.00, 8.20)
,('150017', 'Tuesday', '2019-12-24', '2019-12-24', '430', 1.00, 4.10)
,('150017', 'Friday', '2019-12-27', '2019-12-27', '430', 1.00, 8.20)
,('150017', 'Monday', '2019-12-30', '2019-12-30', '430', 1.00, 8.20)
,('150017', 'Tuesday', '2019-12-31', '2019-12-31', '430', 1.00, 4.10)
,('150035', 'Tuesday', '2019-03-12', '2019-03-12', '430', 0.66, 5.45)
,('150041', 'Thursday', '2019-01-17', '2019-01-17', '430', 1.00, 8.20)
,('150041', 'Tuesday', '2019-08-20', '2019-08-20', '430', 1.00, 8.20)
,('150041', 'Friday', '2019-08-21', '2019-08-21', '430', 1.00, 8.20)
,('150045', 'Monday', '2019-05-13', '2019-05-13', '430', 1.00, 8.20)
,('150045', 'Tuesday', '2019-05-14', '2019-05-14', '430', 1.00, 8.20)
,('150045', 'Wednesday', '2019-05-15', '2019-05-15', '430', 1.00, 8.20)
,('150045', 'Monday', '2019-11-25', '2019-11-25', '430', 1.00, 8.20)
,('150045', 'Tuesday', '2019-11-26', '2019-11-26', '430', 1.00, 8.20)
,('150045', 'Wednesday', '2019-11-27', '2019-11-27', '430', 1.00, 8.20)
,('150045', 'Thursday', '2019-11-28', '2019-11-28', '430', 1.00, 8.20)
,('150045', 'Friday', '2019-11-29', '2019-11-29', '430', 1.00, 8.20)
,('150046', 'Monday', '2019-03-11', '2019-03-11', '430', 1.00, 8.20)
,('150048', 'Tuesday', '2019-10-08', '2019-10-08', '430', 0.30, 2.50)
,('150048', 'Monday', '2019-10-28', '2019-10-28', '430', 1.00, 8.20)

StartDate和EndDate始终相同,并且仅是工作日(星期一至星期五)。WeekDayName是StartDate的名称。ID是整数。A_Type(此处)始终为430。A_Days(始终小于或等于1),A_Hours(始终小于或等于8.20)。

对于每个ID,所需的输出是StartDate,EndDate,A_Days之和,A_Hours之和,SumDays。SumDays是StartDate和EndDate之间的工作日数。EndDate是一天,是后续日期“块”的最后日期,按ID分组。

例如

ID       StartDate    EndDate     A_Days    A_Hours    SumDays
150017   2019-12-23   2019-12-31  5.00      32.80      5
150035   2019-03-12   2019-03-12  0.66      5.45       1
150041   2019-01-17   2019-01-17  1.00      8.20       1
150041   2019-08-20   2019-08-21  2.00      16.40      2
...

150041有两个记录,因为以下日期有两个“块”。第一个是2019-01-17,第二个是从2019-08-20到2019-08-21。

有人可以帮我吗?(作为奖励,如果也可以按列A_Type分组,那将是很好的)。我无法正常工作。

任何帮助表示赞赏。

先感谢您,

最好

专线小巴

我了解您想将具有相同ID和相邻日期(忽略周末)的记录归为一组。这是一个悬而未决的问题。

这是一种lag()用于检索前一个endDate并将其与当前进行比较的方法startDate; 每当日期不“相邻”时,就会开始一个新的组(需要一些附加的逻辑来处理“星期五>星期一”的间隔)。

select id, min(startDate) startDate, min(endDate) endDate, sum(a_days) a_days, sum(a_hours) a_hours, count(*) sumDays
from (
    select 
        t.*,
        sum(
            case when
                startDate = dateadd(d, 1, lagEndDate) 
                or (weekDayName = 'Monday' and startDate = dateadd(d, 3, lagEndDate))
            then 0 else 1
            end
        ) over (partition by id order by endDate) grp
    from (
        select t.*, lag(endDate) over(partition by id order by endDate) lagEndDate
        from @tbl t
    ) t
) t
group by id, grp

对于您的样本数据,将产生

id | startDate | endDate | a_days | a_hours | sumDays 
:----- | :---------------------- | :---------------------- | :----- | :------ | ------:
150017 | 2019-12-23 00:00:00.000 | 2019-12-24 00:00:00.000 | 2.00 | 12.30 | 2 
150017 | 2019-12-27 00:00:00.000 | 2019-12-31 00:00:00.000 | 3.00 | 20.50 | 3 
150035 | 2019-03-12 00:00:00.000 | 2019-03-12 00:00:00.000 | 0.66 | 5.45 | 1 
150041 | 2019-01-17 00:00:00.000 | 2019-01-17 00:00:00.000 | 1.00 | 8.20 | 1 
150041 | 2019-08-20 00:00:00.000 | 2019-08-21 00:00:00.000 | 2.00 | 16.40 | 2 
150045 | 2019-05-13 00:00:00.000 | 2019-05-15 00:00:00.000 | 3.00 | 24.60 | 3
150045 | 2019-11-25 00:00:00.000 | 2019-11-29 00:00:00.000 | 5.00 | 41.00 | 5 
150046 | 2019-03-11 00:00:00.000 | 2019-03-11 00:00:00.000 | 1.00 | 8.20 | 1 
150048 | 2019-10-08 00:00:00.000 | 2019-10-08 00:00:00.000 | 0.30 | 2.50 | 1 
150048 | 2019-10-28 00:00:00.000 | 2019-10-28 00:00:00.000 | 1.00 | 8.20 | 1个

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

每个月将日期序列分成一个块(包含开始和结束日期)

开始日期和结束日期之间的每个日期一个单元格

PHP日期获取每个期间的开始日期和结束日期

如何创建一个存储过程,在 MYSQL 中的开始日期和结束日期之间获取销售的开始日期和结束日期

如何在SSIS中配置一个foreach循环容器以获取定义的开始日期和结束日期并在其间的每个日期运行?

使用开始日期和结束日期创建一个新列:Pandas

我有一个“开始日期”和“结束日期”列。我想将每行转换为X行,每个包含日期分别

选择一组学生的 SQL 查询,这些学生的学年开始和结束日期包含另一个表中的开始和结束日期?

开始日期和结束日期的数组,其中进行的开始日期 = 上一个结束日期 +1 WORKDAY

如何计算开始日期和结束日期以及如何从下一个开始日期开始每个新行

如何检查当前的开始和结束日期是否在上一个期间(开始和结束日期)

将2个表的开始日期和结束日期合并为一个表

获取开始日期和结束日期

根据另一个熊猫中开始日期和结束日期列的条件创建新的熊猫数据框

如何使用熊猫获取每个组中的上一个和中间日期

创建一个日期在开始和结束日期之间的列表

在开始日期和结束日期之间拆分一个值

获取两个日期之间每个月的开始和结束时间

如何从 C# 中的另一个开始日期和结束日期按天间隔获取所有可能的期间(带有开始日期和结束日期)的列表

如何从开始日期和结束日期识别和汇总序列

R从组的开始日期和结束日期创建时间序列的最佳方法

重塑带有开始日期和结束日期的数据集,以创建一个按天/月/季度计算总和的时间序列

我如何用开始日期和结束日期之间的日期范围填充一个单元格

从日期获取星期开始日期和星期结束日期

创建一个序列列以根据日期时间和事件获取订单

我想从一个月的一周中获取开始日期和结束日期(android)

在开始日期和结束日期列之间搜索开始日期和结束日期MySQL,Laravel

熊猫-从事件的数据框中创建一个10分钟的时间序列,并带有开始和结束日期和时间

两个日期之间的开始日期和结束日期