【问题标题】:Group by 7 day interval postgresql按 7 天间隔分组 postgresql
【发布时间】:2019-09-22 14:39:39
【问题描述】:

我知道这是一个常见问题,但我找不到与我的情况相符的内容。我有这些数据:

  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 天的时间间隔对这些数据进行分组。也就是说,这些组将是:

  • 第 1 组:id 1 到 7
  • 第 2 组:id 8 和 9
  • 第 3 组:id 10 到 14

这个查询在 PostgreSQL 中怎么样?

提前致谢

【问题讨论】:

  • 请定义“7天间隔”。

标签: sql postgresql date group-by intervals


【解决方案1】:

我将按照以下方式进行:

  • 首先,使用子查询将当前记录的日期与系列的最小日期进行比较;日期之间的天数差除以 7 为您提供记录所属组的第一个版本(但目前组编号不一定是连续的)
  • 然后,在外部查询中使用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

Demo on DB Fiddle;

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

【讨论】:

    【解决方案2】:

    如果您想根据 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
    

    【讨论】:

    • @Fabi_Z 。 . .您是否有理由不接受此答案?
    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2013-10-24
    • 2010-09-16
    相关资源
    最近更新 更多