Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按7天间隔分组postgresql_Sql_Postgresql_Date_Group By_Intervals - Fatal编程技术网

按7天间隔分组postgresql

按7天间隔分组postgresql,sql,postgresql,date,group-by,intervals,Sql,Postgresql,Date,Group By,Intervals,我知道这是一个常见的问题,但我找不到符合我的情况的东西。我有以下数据: 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 | 2

我知道这是一个常见的问题,但我找不到符合我的情况的东西。我有以下数据:

  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和id 9 第3组:id 10至14 这个查询在PostgreSQL中是如何实现的


提前感谢

我将按照以下步骤进行:

首先,使用子查询将当前记录的日期与序列的最小日期进行比较;日期之间的天数差除以7可以得到记录所属组的第一个版本,但目前组号不一定是连续的 然后,在外部查询中使用稠密_秩将组号重新指定为连续编号: 查询:

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
)


我将进行以下工作:

首先,使用子查询将当前记录的日期与序列的最小日期进行比较;日期之间的天数差除以7可以得到记录所属组的第一个版本,但目前组号不一定是连续的 然后,在外部查询中使用稠密_秩将组号重新指定为连续编号: 查询:

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
)


如果要根据七天的间隔对事物进行分组,请使用滞后和累积总和来定义组:

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

如果要根据七天的间隔对事物进行分组,请使用滞后和累积总和来定义组:

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

请定义7天间隔。请定义7天间隔。@Fabi_Z。你不接受这个答案有什么原因吗?@Fabi_Z。你不接受这个答案有什么原因吗?