如何在postgresql中按周分组
我有一个包含以下列的数据库表提交: id |作者|姓名|作者|电子邮件|作者|日期时间戳| 总行数 样本内容包括:如何在postgresql中按周分组,sql,postgresql,Sql,Postgresql,我有一个包含以下列的数据库表提交: id |作者|姓名|作者|电子邮件|作者|日期时间戳| 总行数 样本内容包括: 1 | abc | abc@xyz.com | 2013-03-24 15:32:49 | 1234 2 | abc | abc@xyz.com | 2013-03-27 15:32:49 | 534 3 | abc | abc@xyz.com | 2014-05-24 15:32:49 | 2344 4 | abc | abc@xyz.com | 2014-05-28 15:32
1 | abc | abc@xyz.com | 2013-03-24 15:32:49 | 1234
2 | abc | abc@xyz.com | 2013-03-27 15:32:49 | 534
3 | abc | abc@xyz.com | 2014-05-24 15:32:49 | 2344
4 | abc | abc@xyz.com | 2014-05-28 15:32:49 | 7623
我想得到如下结果:
id | name | week | commits
1 | abc | 1 | 2
2 | abc | 2 | 0
我在网上搜索类似的解决方案,但找不到任何有用的
我尝试了以下查询:
SELECT date_part('week', author_date::date) AS weekly,
COUNT(author_email)
FROM commits
GROUP BY weekly
ORDER BY weekly
但这不是正确的结果 如果你有多年,你也应该考虑到这一年。一种方法是:
SELECT date_part('year', author_date::date) as year,
date_part('week', author_date::date) AS weekly,
COUNT(author_email)
FROM commits
GROUP BY year, weekly
ORDER BY year, weekly;
更自然的书写方式是使用date_trunc:
很久没有人问过这个问题了。 不管怎样,如果有人经历了这一切 如果您想要计算没有提交/记录的所有中间周的计数,您可以通过提供开始日期和结束日期来生成序列函数 选择t1.year\u week周, t2.提交计数 从选择周开始, 给你一周,一年一周 从生成_系列'2020-02-01 06:06:51.25+00'::日期, '2020-04-05 12:12:33.25+00':: 日期,“1周”:间隔为第1周 左外连接选择字符或日期“IYYY-IW”年/周, COUNTauthor\u电子邮件提交\u计数 从提交 按年份分组(t2周) t1.year_week=t2.year_week; 输出将是:
week | commit_count
----------+-------------
2020-05 | 2
2020-06 | NULL
2020-07 | 1
这怎么不正确呢?问题是什么?@GordonLinoff:我们如何在这个查询中也包含零提交周?我测试了这一行,它给出了至少一个提交的所有行。@jilsontomas。如果您有问题,最好以问题的形式提问,而不是以评论的形式提问。@GordonLinoff按日期_part'year',x,日期_part'week',x分组,这很可能不是用户想要的,应该被认为是不正确的。例如,2017年的第一天仍然是2016年开始的第52周的一部分,因此2017年的第52对可能根本不是你想要的,因为它一直排到2017年底。另一方面,使用“date\u trunc'week”,x`可以正常工作。@GordonLinoff我收到这个错误-django.db.utils.ProgrammingError:函数date\u trunc未知,未知不是唯一的,提示:无法选择最佳候选函数。您可能需要添加显式类型转换。我使用的是Django和PostgreSQL。注意:date_part将周格式化为可能更理想的周数,而date_trunc给出了一个日期。
week | commit_count
----------+-------------
2020-05 | 2
2020-06 | NULL
2020-07 | 1