从星期三开始按周分组的 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在雪花 sql 中使用 date_trunc 更改默认的星期几和时间戳