2012-05-03 3 views
2

2つのカテゴリの範囲を決定したいと考えています。カテゴリーAとカテゴリーBのAは15に1から始まり、Bは再び40 に32から始まり、このクエリSQLデータ範囲最小最大カテゴリ

select min(range), max(range) 
from table 
group by category 
order by category 

を実行すると今では1から私に、カテゴリAの範囲を与え、その後31に16から始まりますカテゴリBを16から31に変更しました。範囲を壊して結果を見たいと思っています

Category A 1 to 15 
Category B 16 to 31 
Category A 32 to 40 

どうすればよいですか? 3列目が必要ですか?私は新しいカテゴリと3番目の列を持っている場合は、それぞれC D Eを言うことができる、私はそれらによってグループ化し、結果を得ることができます知っている。しかし私はそれをする方法を知らない。

私を助けてください。

おかげ -Adeel

+0

あなたはどのRDBMSを使用していますか? –

+0

適切な範囲の決定に使用する基準は何ですか?特に、範囲は必然的に整数のシーケンスですか?つまり、最初の範囲に「8」がない場合は、1つの範囲か2つになりますか? –

答えて

1

あなたは連続した整数から成るグループにカテゴリを打破しようとしていると仮定すると、次のように動作します:

select category, diff, min(range), max(range) 
from 
(
    select category, range, 
     (range - row_number() over (partition by category order by range)) as diff 
    from table 
) t 
group by category 
order by 1, 3 

このクエリは、観察に基づいて、そのカテゴリの与えられたグループ内、数字は順番に増加します。したがって、整数のシーケンスを減算すると、その特定の範囲を識別するために使用できる定数が得られます。

Row_Number()は標準のSQL関数なので、ほとんどのデータベースで使用できます。

+0

こんにちはゴードン。これは非常に良い例であり、私は今それを試し、あなたに知らせるでしょう。 – Mozung

+0

ゴードン、私はちょうどあなたのコードを試して、それは魅力のように働いた。私はとても幸せだ。 :D – Mozung

+0

ありがとう! – Mozung

0

それはあなたのために働く必要がありますrecursive CTEように聞こえるが、それは、これが働く可能性がどのようにあなたのRDBMSに依存し(そしてそれはでもサポートされている場合)しかし、あなたはおそらくのいくつかの並べ替えを行うことができます各ピースの最大乗数までの乗数として使用できる増分カウント。私たちにRDBMSを教えていただければ、私は例を挙げることができます。

+0

こんにちはジャスティン、CTEは許可されており、私はこれらの作業ができます。私に例を挙げてください。ありがとう – Mozung

関連する問題