来自其他表的分组日期范围

Posted

技术标签:

【中文标题】来自其他表的分组日期范围【英文标题】:Group Date Range from other table 【发布时间】:2021-05-25 00:25:54 【问题描述】:

我想根据另一个表格的日期范围对表格进行分组。

我正在尝试执行以下查询,其中我加入了一个表 Actuals,该表有一个 StartDate

我想将其Amounts 按具有StartDateEndDate 的财政月份分组,其中Actual.StartDateFiscalMonthsCalendarOptions 开始日期和结束日期之间。我不能做困难的几个月(这将是GROUP BY DATEPART(month, act.StartDate), act.LinkingId 的一个简单组),这就是让这变得困难的原因。

我尝试了以下操作,但显然您可以对表别名进行分组。我相信正确的方法是使用 partition by 并且可能使用 lag 运算符,但我无法让它工作。

SELECT 
    act.LinkingId,
    SUM(act.Amount) as AmountTotal,
    CASE 
        WHEN act.StartDate BETWEEN fco.StartDate AND fco.EndDate 
           THEN fco.StartDate
           ELSE act.StartDate
    END AS FiscalStartDate
FROM 
    [Actuals] act
INNER JOIN 
    FiscalMonthsCalendarOptions fco ON 1 = 1 
WHERE 
    act.Amount <> 0
GROUP BY 
    FiscalStartDate, act.LinkingId

我用示例数据和预期结果制作了一个快速示例表

DECLARE @actuals TABLE (LinkingId int, StartDate datetime, Amount decimal(18,4))
INSERT INTO @actuals(LinkingId, StartDate, Amount)
VALUES (1, '2021-01-01', 5),
(1, '2021-01-15', 3),
(2, '2021-01-01', 5),
(2, '2021-01-30', 4),
(2, '2021-02-05', 2)

DECLARE @fiscalMonthsCalendarOptions TABLE (StartDate datetime, EndDate datetime, Code varchar(20))
INSERT INTO @fiscalMonthsCalendarOptions (StartDate, EndDate, Code)
VALUES ('2020-12-30', '2021-1-29', 'January'),
('2021-1-30', '2021-2-28', 'Feburary')

-- RESULT DESIRED: (LinkingId, Amount, StartDate)
-- (1, 8, 2020-12-30)
-- (2, 5, 2020-12-30)
-- (2, 6, 2021-1-30)

【问题讨论】:

【参考方案1】:

一种解决方案是在act.StartDate 上加入日历表,这样您就不必乱用partition by

SELECT 
    act.LinkingId,
    SUM(act.Amount) as AmountTotal,
    fco.StartDate
FROM @actuals act
INNER JOIN @fiscalMonthsCalendarOptions fco on act.StartDate between fco.StartDate AND fco.EndDate
GROUP BY fco.StartDate, act.LinkingId

【讨论】:

以上是关于来自其他表的分组日期范围的主要内容,如果未能解决你的问题,请参考以下文章

t-sql 从平面日期列表中总结日期范围,按其他列分组

在mysql和php中按日期范围分组

使用熊猫按日期范围分组

按名称分组的连续日期范围内的最小和最大日期

按日期范围分组

MDX 查询以对具有特定日期范围的日期维度进行分组