[英]How to group by week use sunday based week
是否可以在 posgresql 中按星期使用基于星期日开始的日期进行分组? 如果是这样,逻辑是什么?
对的,这是可能的。 使用date_bin function。 它在 PG 版本 14 及更高版本中可用。
这是 PG14 之前版本的实现。
插图:
select date_bin('1 week', d, '2022-01-02')::date as db, count(1)
from generate_series('2022-07-01'::timestamp, '2022-10-01', '1 day') as d
group by db
order by db;
/*
2022-01-02 is a Sunday
db |count|
----------+-----+
2022-06-26| 3|
2022-07-03| 7|
2022-07-10| 7|
2022-07-17| 7|
2022-07-24| 7|
2022-07-31| 7|
2022-08-07| 7|
2022-08-14| 7|
2022-08-21| 7|
2022-08-28| 7|
2022-09-04| 7|
2022-09-11| 7|
2022-09-18| 7|
2022-09-25| 6|
*/
或者,您可以在任何版本上使用date_trunc
。 当您按周截断时,它将使用星期一,但这可以通过添加一天来解决,以便星期日日期滚动到下一周:
select
date_trunc ('week', my_date + 1)
from
my_table
group by
date_trunc ('week', my_date + 1)
当您渲染最终的 output 时,请务必从字段中减去日期(无需在 group-by 中这样做):
select
date_trunc ('week', my_date + 1) - interval '1 day' as sunday,
count (*)
from
my_table
group by
date_trunc ('week', my_date + 1)
如果my_date
是时间戳(以下也适用于日期),则:
date_trunc ('week', my_date + interval '1 day')
代替:
date_trunc ('week', my_date + 1)
您也可以将其封装到 function 中,但除非您在所有地方都使用它,否则这似乎有点矫枉过正。
create or replace function sunday(input_date date)
returns date
language sql
as
$BODY$
select (date_trunc ('week', input_date + 1) - interval '1 day')::date
$BODY$
select
sunday(my_date), count (*)
from
my_table
group by
sunday(my_date)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.