この例のように、列に繰り返し値の範囲を含むテーブルを選択ステートメントを使用して作成する方法はありますか?
例:
入力テーブルから:
id value:
1 25
2 25
3 24
4 25
5 25
6 25
7 28
8 28
9 11
結果は次のとおりです。
range value
1-2 25
3-3 24
4-6 25
7-8 28
9-9 11
注: 入力テーブルの ID 値は常に順番どおりであり、ID で並べ替えられた 2 つの値の差は常に 1 です。
連続した値のシーケンスを見つけたいとします。ウィンドウ関数を使用した 1 つのアプローチを次に示します。
select min(id), max(id), value
from (select id, value,
row_number() over (order by id) as rownum,
row_number() over (partition by value order by id) as seqnum
from t
) t
group by (rownum - seqnum), value;
これは、値が行のさまざまな場所に表示される可能性があることを考慮に入れています。考え方は単純です。 rownum
連番です。 seqnum
指定された値に対してインクリメントする連番です。これらの差は、連続する値に対して一定です。
付け加えておきますが、実際に「1-2」という表現が必要な場合は、さらに情報が必要です。id が文字列であると仮定すると、データベースに応じて、次のいずれかが機能します。
select min(id)+'-'+max(id), . . .
select concat(min(id), '-', max(id)), . . .
select min(id)||'-'||max(id), . . .
id が整数の場合 (私が推測するように) id
、上記の式の sを に置き換える必要がありcast(id as varchar(32))
ます。ただし、Oracle ではcast(id as varchar2(32))
.
SELECT CONCAT(MIN(id), '-', MAX(id)) AS id_range, value
FROM input_table
GROUP BY value
多分これ:
SELECT MIN(ID), MAX(ID), VALUE FROM TABLE GROUP BY VALUE