Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Sql范围组开始和结束Id_Sql_Postgresql - Fatal编程技术网

Sql范围组开始和结束Id

Sql范围组开始和结束Id,sql,postgresql,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 是

我有一个查询,我想分成大小为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中有这样做的方法,请提供一个示例。

Hmmm,我认为最简单的方法是使用行号:

编辑:

根据您的评论:

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;
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
只过滤偶数和4块


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

@lad2025我从未使用过这些关键字。谢谢,我会看看我能想出什么,如果还有问题,我会更新我的问题;终止存在终止或对开始、结束或范围内的ID列表开始,end@JuanCarlosOropeza第二种选择。配对、开始、结束、开始、结束等。例如,3557将有200个项目,因为ID不是连续的?非常接近我正在寻找的内容,如果我在应用程序中编写一些逻辑来解释这些结果,就会起作用。理想的解决方案会给出与您相同的结果,但每行都有开始、结束。此外,如果最终范围不是完整的200,它应该提供我查询中的最后一个id;在我的OP中,我没有明确定义它。只需从表中添加或seqnum=SELECT count*以包含最后一个ID。最后一次编辑给出了我需要的确切结果。谢谢在接受任何一个答案之前,对效率和其他答案进行测试。两个答案的表现似乎一样好。不过我更喜欢这个。谢谢你们两位——这些答案教会了我很多。我很难做到这一点。正在获取“SELECT处或附近的语法错误引用…”。。。COALESCR.id,选择MAXid FROM…稍等,我将准备一个SQLFIDDLE拼写错误的COALESCE,我还包括一个包含较小数据的示例。请检查此处的帮助,这是为了解决最后一个空值。可能是我的postgres或pgadmin版本,但我唯一能让它工作的方法是-COALESCER.id,从cte选择MAXid
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