Sql范围组的开始和结束标识

时间:2015-10-22 18:35:37

标签: sql postgresql

我有一个查询,我想要分成大小为200的“块”并返回每个“块”的起始ID和结束ID。

示例:

select t.id
from t
where t.x = y --this predicate will cause the ids to not be sequential

如果示例是查询我试图闯入'块',我想要返回:

(第一个ID,第200个ID),(第201个ID,第400个ID)...(最终范围ID的开始,范围ID的结束)

编辑:对于最终范围,如果它不是完整的200行,它仍应提供查询中的最终ID。

有没有办法只使用SQL来执行此操作,还是必须使用类似于分页实现的应用程序处理和/或多个查询?

如果有办法在SQL中执行此操作,请提供示例。

2 个答案:

答案 0 :(得分:2)

嗯,我认为最简单的方法是使用row_number()

select id
from (select t.*, row_number() over (order by id) as seqnum
      from t
      where t.x = y
     ) t
where (seqnum % 200) in (0, 1);

编辑:

根据您的意见:

select min(id) as startid, max(id) as endid
from (select t.*,
             floor((row_number() over (order by id) - 1) / 200) as grp
      from t
      where t.x = y
     ) t
group by grp;

答案 1 :(得分:1)

左侧的

L和右侧的R

WITH cte AS (
    SELECT 
          t.id,
          row_number() over (order by id) as seqnum
    FROM Table t
    WHERE t.x = y
)
SELECT L.id as start_id, COALESCE(R.id, (SELECT MAX(ID) FROM cte) ) as end_id
FROM cte L
LEFT JOIN cte R
      ON L.seqnum = R.seqnum - 199
WHERE  L.seqnum % 200 = 1

SqlFiddleDemo 仅过滤偶数和4的块。

查看大小为200的块的R.seqnum - 199