【问题标题】:For each date in range, get records with date in range对于范围内的每个日期,获取日期范围内的记录
【发布时间】:2021-10-28 14:34:02
【问题描述】:

假设我有一张桌子Orders,每个订单都有一个CreatedDate 和一个DeliveredDate 列。

如何为范围内的每个日期选择一个计数,该计数包括日期在CreatedDateDeliveredDate 之间的所有记录?假设获取 2021-10-04 到 2021-10-09 范围内的结果

如果Orders 表如下所示

ID       CreatedOn      DeliveredOn       
1        2021-10-04     2021-10-04      
2        2021-10-06     2021-10-07      
3        2021-10-06     2021-10-08 
4        2021-10-07     2021-10-08      
5        2021-10-08     2021-10-09      
     

结果应该是这样的

Date            ActiveCount
2021-10-04      1
2021-10-05      0
2021-10-06      2
2021-10-07      3
2021-10-08      3
2021-10-09      1

因此命令 1 仅适用于 2021-10-04 的计数,但命令 3 适用于 2021-10-06、2021-10-07 和 2021-10-08 的计数,因为那是当天已送达。

我对 SQL 不是很好,而且我在思考如何做到这一点时遇到了麻烦。如果有人能指出我正确的方向,我将不胜感激!

【问题讨论】:

  • 结果中的日期范围来自哪里?您有日期表,还是从用户输入或存储过程参数中获取它?在您要加入的另一个表中定义?在查询中硬编码?
  • @squillman 这是一个存储过程,日期范围将来自参数。现在我有一个加入日期表的过程,以确保我得到没有任何相关记录的日期的计数。我现在按一个日期分组的过程,以便每条记录都计入该范围内的一天。根据表中的两个日期,我需要每条记录可能超过一天。

标签: sql sql-server


【解决方案1】:

假设您将根据输入参数值在过程中生成日期表,您只需要一个LEFT JOIN 和一个COUNTGROUP BY

DECLARE @Dates TABLE ([Date] DATE);
DECLARE @Orders TABLE (ID INT, CreatedOn DATE, DeliveredOn DATE);

INSERT @Dates ([Date])
VALUES ('2021-10-04'),('2021-10-05'),('2021-10-06'),
       ('2021-10-07'),('2021-10-08'),('2021-10-09');

INSERT @Orders (ID, CreatedOn, DeliveredOn)
VALUES (1, '2021-10-04', '2021-10-04'),
       (2, '2021-10-06', '2021-10-07'),
       (3, '2021-10-06', '2021-10-08'),
       (4, '2021-10-07', '2021-10-08'),
       (5, '2021-10-08', '2021-10-09');

SELECT d.[Date], COUNT(ID) AS ActiveCount
FROM @Dates d
LEFT JOIN @Orders o ON o.CreatedOn <= d.[Date] AND o.DeliveredOn >= d.[Date]
GROUP BY d.[Date];

表格的顺序在这里很重要。您想查看该范围内的所有日期,因此您从该表开始。 LEFT JOIN 将返回该表中的所有记录,并从与 JOIN 条件匹配的 Orders 表中引入记录。您将获得每场比赛的单独记录,因此请使用 COUNTGROUP BY 来获取每日总计数。

【讨论】:

  • 谢谢。这正是我所需要的。
【解决方案2】:

如果你有一个包含所有日期的表格,那么类似的东西应该可以工作:

SELECT d.[date] as [Date], COUNT(*) as ActiveCount
FROM dates d
WHERE d.[date] >= @startDate AND d.[date] <= @endDate
LEFT JOIN orders o ON o.CreatedDate <= d.[date] and o.DeliveredDate >= d.[date]
GROUP BY d.[date]
ORDER BY [Date]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2013-03-02
    • 2014-11-01
    • 2020-10-09
    相关资源
    最近更新 更多