SQL postgres 提取周

SQL postgres extract week

你能帮我修改以下代码以每周而不是每月提取 Distinct user_id 吗? user_id 在给定的一周内只能出现 1 次。

 SELECT
COUNT(DISTINCT user_id),
 EXTRACT(YEAR FROM created_at) Y,
EXTRACT(MONTH FROM created_at) M
FROM user_logins
WHERE created_at >= '2017-01-01'
 AND created_at <= '2018-04-10' 
GROUP BY EXTRACT(YEAR FROM created_at),EXTRACT(MONTH FROM created_at)
ORDER BY Y,M

SELECT
  COUNT(DISTINCT user_id),
  to_char(created_at, 'YYYY-MM') YM
FROM user_logins
WHERE created_at >= '2017-01-01'
  AND created_at <= '2018-04-10' 
GROUP BY to_char(created_at, 'YYYY-MM')
ORDER BY YM

extract 会给你一年中的周数,所以如果你有几年,那么计数将是所有年份 - 所以它不是每周,而是 "for any year week number":

t=# with c(d) as (values('2016-04-19'::date),('2017-04-19'))
select count(*), extract(week from d) from c group by extract(week from d);
 count | date_part
-------+-----------
     2 |        16
(1 row)

如果您需要每周数据,根据唯一时间标识符,请改用 date_trunc

t=# with c(d) as (values('2016-04-19'::date),('2017-04-19'))
select count(*), date_trunc('week', d) from c group by date_trunc('week', d);
 count |       date_trunc
-------+------------------------
     1 | 2017-04-17 00:00:00+00
     1 | 2016-04-18 00:00:00+00
(2 rows)

您可以使用 WW 提取周数或使用 IW 提取更标准的 ISO week。您必须将年份包括在内,因为 "current" 年中的某些周部分在去年或下一年。使用 IW 时,您还需要使用对应于该周数

的 "ISO year"
SELECT COUNT(DISTINCT user_id),
       to_char(created_at, 'IYYYY-IW') as week
FROM user_logins
WHERE created_at >= '2017-01-01'
  AND created_at <= '2018-04-10' 
GROUP BY to_char(created_at, 'IYYYY-IW')
ORDER BY week;

这也可以使用 extract() 函数来完成:

SELECT COUNT(DISTINCT user_id),
       extract(isoyear from created_at) as year, 
       extract(week from created_at) as week
FROM user_logins
WHERE created_at >= '2017-01-01'
  AND created_at <= '2018-04-10' 
GROUP BY extract(isoyear from created_at), extract(week from created_at) 
ORDER BY week;