【问题标题】:Overlap SQL with group by将 SQL 与 group by 重叠
【发布时间】:2020-05-08 12:31:03
【问题描述】:

我有一个关于 SQL 重叠的问题,我的数据库中有以下结构和数据:

Table A (Id = uniqueidentifier)
| Name |  StartDate  |    EndDate    | DaysToReceive |
------------------------------------------------------
|   A  |  2019-08-26 |   2020-04-13  | 232           |
|   A  |  2019-12-15 |   2020-04-11  | 119           |
|   A  |  2020-03-06 |   2020-03-31  | 26            |
|   B  |  2020-01-07 |   2020-01-31  | 25            |
|   B  |  2020-02-11 |   2020-02-29  | 19            |

我需要获取接收日期,但如果有重叠,我需要最小日期和最大日期之间的差异,否则我使用 DaysToReceive 求和列。

我试图让结果看起来像这样:

| Name | DaysToReceive |
------------------------
   A   |     232
   B   |     44

我已设法获得此查询,但仅适用于重叠日。

select DATEDIFF(d, MIN(t1.dt),MAX(t1.enddt)) + 1 as DaysToReceive
from (
    select distinct cp1.dt, min(cp2.dt) enddt
    from ( select StartDate as dt, Id from TableA ) cp1, 
         ( select EndDate as dt from TableA ) cp2
    where cp2.dt > cp1.dt cp1.Id = cp2.Id
    group by cp1.dt
    ) t1, TableA t2
where t2.StartDate between t1.dt and t1.enddt
group by t1.dt, t1.enddt

提前致谢。 干杯

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。我还建议您添加一个 db/SQL 小提琴。这不是一个小问题。
  • 你确定 A 的值 232 是正确的吗?这是怎么回事:| A | 2019-08-26 | 2019-04-13 | 232 | 与 | A | 2020-03-06 | 2020-03-31 | 26 | 重叠
  • @kebek 是的,因为当我保存时我会计算开始日期和结束日期之间的差异,但因为2020-03-06 | 2020-03-31 在重叠范围内(2019-08-26 | 2019-04-13)我不需要这个值。
  • A的开始日期的第一条和第二条记录在结束日期之后?
  • @Srinika,小费不好。现在是 2020 年。

标签: sql overlap sql-server-2017


【解决方案1】:

检查一下

Select [name], Case when [InRange] = 1 
   then Max(DateDiff(dd, MinStartdate, MaxEnddate) + 1)
   Else
       Sum(DateDiff(dd, Startdate, Enddate) + 1)
   End as [Days]

from
(
Select Distinct a.[name], StartDate, EndDate, MinStartdate, MaxEnddate,
    Case when StartDate > MinStartdate and EndDate < MaxEnddate or 
    (StartDate = MinStartdate and EndDate = MaxEnddate)  then
        1 Else 0  
        End as [InRange]
from
(
SELECT [name], 
   Min(StartDate) AS MinStartdate, Max(EndDate) AS MaxEnddate 
FROM A
Group By [Name]

) Q
inner join A a
on a.[name] = q.[name]
) QQ

这里是fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 2010-09-30
    • 2011-06-21
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多