名前と整数が1〜288の範囲のテーブルには、約10億行のデータがあります。指定されたnameに対して、すべての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)
行が非常に多いので、より効率的であることが望ましいです。ただし、このクエリを実行する必要があるのは1回だけなので、絶対的な要件ではありません。
前もって感謝します!
編集:
PL / pgSQLソリューションは大歓迎です(ファンシーなトリックについて説明してください-私はまだPL / pgSQLは初めてです)。