我在一个表中有大约十亿行数据,其中一个名称和一个介于1-288之间的整数。对于给定的名称,每个int都是唯一的,并且不会出现该范围内的每个可能的整数-因此存在间隙。
此查询生成一个示例案例:
--what I have:
SELECT *
FROM ( VALUES ('foo', 2),
('foo', 3),
('foo', 4),
('foo', 10),
('foo', 11),
('foo', 13),
('bar', 1),
('bar', 2),
('bar', 3)
) AS baz ("name", "int")
我想为每个名称和连续整数序列生成一个查询表,并在其中一行。每个这样的行将包含:
名称 -的值的名字列
开始 -在所述连续序列中的第一个整数
端 -在连续序列的最终值
跨度 - 端-开始+ 1
该查询为上述示例生成示例输出:
--what I need:
SELECT *
FROM ( VALUES ('foo', 2, 4, 3),
('foo', 10, 11, 2),
('foo', 13, 13, 1),
('bar', 1, 3, 3)
) AS contiguous_ranges ("name", "start", "end", span)
因为我有很多行,所以效率更高更好。也就是说,我只需要运行一次此查询,因此这不是绝对要求。
提前致谢!
编辑:
我应该补充一点,欢迎使用PL / pgSQL解决方案(请解释任何花哨的技巧-我还是PL / pgSQL的新手)。