【问题标题】:Group by Week in Transact-SQL在 Transact-SQL 中按周分组
【发布时间】:2016-08-02 22:15:23
【问题描述】:

我正在尝试获取 7 天内的项目计数,同时仍然能够报告所述 7 天期间的第一个日期。到目前为止我最接近的是

WITH w (w, n)
AS 
(
    SELECT MIN(CAST(CreatedDate AS DATE)) 
                OVER(   
                        PARTITION BY DATEPART(WEEK, CAST(CreatedDate AS DATE)) 
                        ORDER BY DATEPART(WEEK, CAST(CreatedDate AS DATE))
                    )
            ,COUNT(*)
    FROM dbo.Tbl
    WHERE 
        CreatedDate >= CAST(DATEADD(MONTH,-6,GETDATE()) AS DATE)
    GROUP BY CAST(CreatedDate AS DATE)
)
SELECT w.w AS [Week of], SUM(w.n) AS [Items]
FROM w
GROUP BY w.w
ORDER BY 1 DESC

但不幸的是,这不适用于一年中的第一周或最后一周,如果日期范围超过一年,也将无法使用。

有没有办法按 7 天的时间段进行分组,同时仍然能够获得该时间段内的第一个日期?

【问题讨论】:

  • 不使用 DATEPART,而是使用从开始日期算起的几周的 DATEDIFF。例如PARTITION BY DATEDIFF(WEEK, myStartDate, CreatedDate)...
  • @ZLK 这仅在服务器的@@DATEFIRST 值对应于分析所需的 7 天期间的开始时才有效。
  • @iamdave 确实如此。它应该是 datediff(day...)/7

标签: sql-server tsql


【解决方案1】:

您可以使用以下方法根据您的日期值获取周数。您将需要调整添加的日期以获得适合您情况的一周中的几天,但您将始终保证相同的开始和结束日期。在这种情况下,一周从周日开始,到周六结束:

declare @Date datetime

set @Date = '20160802'

select @Date - DATEPART(dw, @Date) + 1 as FirstDateOfWeek
      ,@Date + (7 - DATEPART(dw, @Date)) as LastDateOfWeek

对于完全防弹的解决方案,您可以添加逻辑以检查和使用 @@DATEFIRST 并相应地分配调整值。

一旦你有了你的周开始值,你就可以在你的group by中使用它:

select CreatedDate - DATEPART(dw, @Date) + 1 as FirstDateOfWeek
      ,count(*)
from tbl
group by CreatedDate - DATEPART(dw, @Date) + 1
order by FirstDayOfWeek

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多