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;
你能帮我修改以下代码以每周而不是每月提取 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
时,您还需要使用对应于该周数
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;