【问题标题】:How to get the records grouping dates for a span of 3 days in SQL?如何在 SQL 中获取 3 天的记录分组日期?
【发布时间】:2013-12-02 08:09:51
【问题描述】:

每 5 天对记录进行分组和显示变得越来越困难。

这是我的数据:

FLIGHT_DATE LANDINGS    PILOTID COPILOTNAME MONT    DPT

11/16/2013  1   A   B   11  5.5
11/17/2013  1   A   B   11  13
11/19/2013  1   A   B   11  12.55
11/19/2013  1   A   B   11  4
11/21/2013  1   A   B   12  6
11/24/2013  1   A   B   12  6.03
11/25/2013  1   A   B   11  5.5
11/26/2013  1   A   B   11  13
11/26/2013  1   A   B   11  12.55
11/30/2013  1   A   B   11  4
12/1/2013   1   A   B   12  6
12/2/2013   1   A   B   12  6.03        

我想显示如下:

Week Start  Week End    DPT         
11/17/2013  11/21/2013  35.55           
11/22/2013  11/26/2013  37.08           
11/27/2013  12/1/2013   6           
12/2/2013   12/6/2013   6.03

【问题讨论】:

  • 您选择11/17/2013作为周开始的基础是什么?

标签: sql-server sql-server-2005


【解决方案1】:

这是我提出的解决方案:

DECLARE @MinDate AS DATETIME = (SELECT MIN(flight_date) FROM flights);

WITH cte
AS
(
    SELECT
        flight_date, DATEDIFF(DAY, @MinDate, flight_date) AS NoDays,
        DATEDIFF(DAY, @MinDate, flight_date)/5 AS NoGroup,
        DPT
    FROM flights
)
SELECT  
    DATEADD(DAY, NoGroup*5, @MinDate) AS [Week Start],
    DATEADD(DAY, NoGroup*5+4, @MinDate) AS [Weed End],  
    SUM(DPT)
FROM cte
GROUP BY NoGroup;

这个想法是形成 5 天的组,然后将记录与基于除法的特定组关联 5。NoDays 表示从 MinDate 到 Flight_Date 所用的天数。

【讨论】:

  • 是的,上面的解决方案更适合使用。谢谢
【解决方案2】:

您可以使用此查询。您需要指定要计算的开始日期和每个期间的天数(在您的情况下似乎是 5),但请根据需要调整这些数字。

declare @startdate date = '20131117'
declare @interval int = 5

select dateadd(dd, @interval * (o.number - 1), @startdate) WeekStart, 
    dateadd(dd, @interval * o.number - 1, @startdate) WeekEnd,
    sum(d.DPT) DPT
from yourtable d
inner join
    (select ROW_NUMBER() over (order by object_id) as number from sys.all_objects) as o
on d.FLIGHT_DATE >= dateadd(dd, @interval * (o.number - 1), @startdate)
and d.FLIGHT_DATE < dateadd(dd, @interval * o.number, @startdate)
group by o.number
order by dateadd(dd, @interval * (o.number - 1), @startdate)

【讨论】:

  • 如果我在 25/11 开始我的一天跨度(7 天而不是 4 天),那么 01/12 的记录将被添加到下周
  • 请注意,您的间隔是 5,而不是 4。
  • 好的,现在我验证它是正确的。但是您有一个错误,对于日期 11/27/2013 12/1/2013,它应该是 10,因为您有 2 条记录,其中 4 和 6。
  • 谢谢!非常感谢,只要查看您发布的评论,脚本就可以正常工作
  • 是的,即使是同一日期和多条记录也可以加起来,非常感谢您的支持
猜你喜欢
  • 2017-05-02
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2020-12-16
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多