从星期三开始按周分组的 SQL

Posted

技术标签:

【中文标题】从星期三开始按周分组的 SQL【英文标题】:SQL for group by week starting Wednesday 【发布时间】:2012-06-25 10:19:59 【问题描述】:

我想要生成一份报告,其中显示每年每周的工作数量,日期可以追溯到 90 年代初。我遇到了一个我似乎无法解决的问题,因为我的 SQL 知识不是很好。

我了解 mysql 将您限制为星期天或星期一开始的星期日期。我想从周三到周二对它们进行分组,所以当我执行 GROUP BY YEAR(JOBID), WEEK(JOBID) 时,它只会显示它们从周日开始按周分组。

我在这里找到了这个

SELECT
    count(jobs) as count,
    CASE WHEN (weekday(datetime)<=3) THEN date(datetime + INTERVAL (3-weekday(datetime)) DAY)
        ELSE date(datetime + INTERVAL (3+7-weekday(datetime)) DAY)
    END as dt
FROM values

但它给了我与

相同的结果集
SELECT 
    COUNT(jobs), 
    Week(datetime) as Week, 
    Year(datetime) as Year 
FROM jobs 
GROUP BY Year(datetime), Week(datetime)

谁能指出我做错了什么?

【问题讨论】:

您能否编辑您的问题并包含一些示例数据以及预期的结果,以便我们更好地帮助您? 【参考方案1】:

最简单的解决方案是使用日历表。您可以使用星期三轻松自定义周作为开始日期,10 年的数据只有大约 3650 行。

http://weblogs.sqlteam.com/dang/archive/2010/07/19/calendar-table-and-datetime-functions.aspx

http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

应该让你开始。

【讨论】:

同意 - 使用日历表比尝试仅使用 SQL 日期函数执行此操作要好得多。【参考方案2】:

您的第一个查询不完整,并且不包含“GROUP BY”子句。请务必“GROUP BY”定义“dt”列的相同“CASE”表达式。

只要您的“GROUP BY”子句编写正确,您的 CASE 语句应该会返回您正在寻找的不同结果集。

我已将您的查询重新表述为 SQL Server 查询,并根据我自己的数据确认它们确实返回了不同的结果集。

这是您所需查询的有效 SQL Server 版本:

SELECT
COUNT([jobs]) AS Count,
CASE
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime]))
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime]))
END AS WeekLabel
FROM JobsTable
GROUP BY
CASE
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime]))
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime]))
END
ORDER BY
CASE
WHEN (DATEPART(dw, [datetime])<=3) THEN Convert(date, DATEADD(day, 3-DATEPART(dw, [datetime]), [datetime]))
ELSE Convert(date, DATEADD(day, 3+7-DATEPART(dw, [datetime]), [datetime]))
END DESC

还有其他比较查询的 SQL Server 版本:

SELECT COUNT([jobs]),
DATEPART(week, [datetime]) AS WeekLabel,
DATEPART(year, [datetime]) AS YearLabel
FROM JobsTable
GROUP BY DATEPART(week, [datetime]), DATEPART(year, [datetime])
ORDER BY DATEPART(year, [datetime]) DESC, DATEPART(week, [datetime]) DESC

【讨论】:

以上是关于从星期三开始按周分组的 SQL的主要内容,如果未能解决你的问题,请参考以下文章

mysql数据库按周统计

在熊猫中按周分组

如何使用 Django ORM 按周分组

如何在雪花 sql 中使用 date_trunc 更改默认的星期几和时间戳

每周分组 python pandas 数据帧(从星期一开始)

关于一个DB2 按照日期分组的问题求解