SQL查询中按日期、天间隔分组
Posted
技术标签:
【中文标题】SQL查询中按日期、天间隔分组【英文标题】:Group by date, day interval in SQL query 【发布时间】:2013-10-24 00:11:16 【问题描述】:假设我有一个类似于以下的表(简化):
| Name | Date | Hours |
| Bob | 10/1/13 | 5 |
| John | 10/1/13 | 8 |
| Bob | 10/2/13 | 6 |
| Ashley| 10/2/13 | 4 |
...
| Bob | 10/17/13 | 4 |
| John | 10/17/13 | 6 |
| John | 10/18/13 | 3 |
...
给定一个开始日期(比如 10/1/13),我如何构造一个查询以按 14 天的间隔对名称、SUM(小时)进行分组?所以结果会是这样的:
| Name | Period | SUM(Hours) |
| Bob | 10/1/13 - 10/14/13 | 11 |
| John | 10/1/13 - 10/14/13 | 8 |
| Ashley| 10/1/13 - 10/14/13 | 4 |
| Bob | 10/15/13 - 10/29/13 | 4 |
| John | 10/15/13 - 10/29/13 | 9 |
我尝试过帖子中列出的建议,例如:Group by date range on weeks/months interval 但他们通常假设你想要实际的几周。由于这些只是 14 天的间隔,它们不一定与一年中的星期一致。
任何建议或指导表示赞赏!
编辑:这是查询 NexusDB 服务器,因此它使用 SQL:2003 标准。
【问题讨论】:
【参考方案1】:可能这样的东西可以工作吗? (假设是 mysql)
更新:在 SQL Fiddle 中测试(感谢 @pm-77-1):http://sqlfiddle.com/#!2/3d7af/2
注意事项:由于我们在这里进行日期运算,如果在大型表上运行此查询可能会变得繁重。
SELECT Name,
CONCAT(DATE_ADD(<your-starting-date>, INTERVAL period*14 day),
" - ",
DATE_ADD(<your-starting-date>, INTERVAL period*14+13 day)) as Period,
Hours FROM
(SELECT Name,
FLOOR(DATEDIFF(Date,<your-starting-date>)/14) AS period,
SUM(Hours) as Hours
FROM <yourtable> GROUP BY period, name) p;
NexusDB 的更新。我在 NexusDB 中找到了一些关于 DateDiff 替换的信息:
http://www.nexusdb.com/support/index.php?q=node/10091
考虑到这一点,您有两种选择:要么将该函数添加到您的数据库中,然后您就不必修改查询,或者将 DATEDIFF 替换为该定义:
SELECT Name,
CONCAT(DATE_ADD(<your-starting-date>, INTERVAL period*14 day),
" - ",
DATE_ADD(<your-starting-date>, INTERVAL period*14+13 day)) as Period,
Hours FROM
(SELECT Name,
FLOOR(cast((cast(Date as float ) - cast(<your-starting-date> as float)) as integer)/14) as period,
SUM(Hours) as Hours
FROM <yourtable> GROUP BY period, name) p;
【讨论】:
它将如何生成第 2、第 3 等 14 天间隔的数据? 内部查询中的 period 是 14 天的块数,从 CURDATE() 即今天开始计算。这在外部查询中用于重新计算该期间的第一天和最后一天(我忘了再乘以 14)。 啊等等,你有一个开始日期,而不是 CURDATE()。将进行更改。 我不是 OP。只是一个观察者。 在GROUP BY
的最后一行应该是period, name
。以上是关于SQL查询中按日期、天间隔分组的主要内容,如果未能解决你的问题,请参考以下文章