[英]Group by 7 day interval postgresql
我知道这是一个常见问题,但我找不到与我的情况相匹配的东西。 我有这个数据:
id | obs
----+------------
1 | 2018-01-01
2 | 2018-01-02
3 | 2018-01-03
4 | 2018-01-04
5 | 2018-01-05
6 | 2018-01-06
7 | 2018-01-07
8 | 2018-01-15
9 | 2018-01-20
10 | 2018-02-03
11 | 2018-02-04
12 | 2018-02-05
13 | 2018-02-06
14 | 2018-02-06
我希望根据 7 天的时间间隔对这些数据进行分组。 也就是说,这些组将是:
PostgreSQL 中的这个查询如何?
提前致谢
我将按照以下方式进行:
DENSE_RANK()
将组编号重新分配为连续编号:询问:
SELECT
id,
obs,
DENSE_RANK() OVER(ORDER BY gr) grp
FROM (
SELECT
id,
obs,
MIN(obs) OVER(),
(obs - MIN(obs) OVER())::int/7 + 1 gr
FROM mytable
) x
ODER BY id
| id | obs | grp |
| --- | ------------------------ | --- |
| 1 | 2018-01-01T00:00:00.000Z | 1 |
| 2 | 2018-01-02T00:00:00.000Z | 1 |
| 3 | 2018-01-03T00:00:00.000Z | 1 |
| 4 | 2018-01-04T00:00:00.000Z | 1 |
| 5 | 2018-01-05T00:00:00.000Z | 1 |
| 6 | 2018-01-06T00:00:00.000Z | 1 |
| 7 | 2018-01-07T00:00:00.000Z | 1 |
| 8 | 2018-01-15T00:00:00.000Z | 2 |
| 9 | 2018-01-20T00:00:00.000Z | 2 |
| 10 | 2018-02-03T00:00:00.000Z | 3 |
| 11 | 2018-02-04T00:00:00.000Z | 3 |
| 12 | 2018-02-05T00:00:00.000Z | 4 |
| 13 | 2018-02-06T00:00:00.000Z | 4 |
| 14 | 2018-02-06T00:00:00.000Z | 4 |
如果要根据 7 天的间隔对事物进行分组,请使用lag()
和累积总和来定义组:
select t.*,
count(*) filter (where prev_obs is null or prev_obs < obs - interval '7 day') over (order by obs) as grp
from (select t.*,
lag(obs) over (order by obs) as prev_obs
from t
) t
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.