如何在postgresql中按周分组

如何在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

我有一个包含以下列的数据库表提交:

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: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