2

次のようなコラムがあります。

ID
--------
1
2
3
4
5
7
10

そして、次の結果セットを取得したい:

ID
--------
1-5
7
10

(Oracle) SQL のみでこれを達成する方法はありますか?

4

2 に答える 2

7

はい:

select (case when min(id) < max(id)
             then cast(min(id) as varchar2(255)) || '-' || cast(max(id) as varchar2(255))
             else cast(min(id) as varchar2(255))
        end)
from (select id, id - rownum as grp
      from t
      order by id
     ) t
group by grp
order by min(id);

これは、それを示す SQL Fiddle です

クエリの背後にある考え方はrownum、一連の数値から減算すると定数になるというものです。グループ化に定数を使用できます。

于 2013-07-31T14:09:29.350 に答える
0

自己結合が必要です...これでうまくいくと思います

Select a.id, b.id
From table a   -- to get beginning of each range
  Join table b -- to get end of each range
    On b.id >= a.Id -- guarantees that b is after a
       And Not exists (Select * From table m  -- this guarantees all values between 
                       where id Between a.id+1 and b.id
                           And Not exists(Select * From table 
                                          Where id = m.id-1))
       And Not exists (Select * From table  -- this guarantees that table a is start 
                       Where id = a.id -1)
       And Not exists (Select * From table  -- this guarantees that table b is end
                       Where id = b.id + 1)
于 2013-07-31T14:17:41.597 に答える