我有一个查询,我想要分成大小为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中执行此操作,请提供示例。
答案 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