2017-01-23 13 views
0

newby to SQLの質問ですのでご容赦くださいシーケンシャルSQLクエリ

単純なSQLクエリの手がかりはありますか?私は一連の数字を範囲内で区切って結果を並べ替えることを試みています。

例えばR00000DからR99999D。

しかし、番号のいくつかが非連続的な順序の例R00000DからR12549Dに割り当てられている場合、次のシーケンスはR200001DからR50000Dです。

だから私は私が行うことができた唯一の方法は優れ、長いったらしい方法と列をカウントするためにエクスポートすることですブロック

すなわち

R00000D to R12549D 
R20000D to R50000D 
R69154D to R99999D 

でグループこれらたいと思います。マイスタートクエリは、単純な

Select * 
FROM SystemNote 
WHERE Note LIKE 'R%' 
+0

こんにちは私はSQLサーバーを使用しています – DJR

答えて

1

ある

私はあなたの順序の要件にテーブルを作成し、それに参加するだろう - これはあなたの要件が変更した場合は、テーブルを変更することができます。ここではインラインテーブルとして扱いますが、実際のテーブルまたはCTEを使用できます。

このコードは、ほとんどのプラットフォームでわずかに変更するだけで動作します。私はそれがDB2上で動作すると私はオラクルと信じています。 valuesステートメントがSQL Serverで機能するかどうかは不明です。 SELECT/UNION ALLに変更する必要があります。

SELECT * 
FROM SystemNote 
LEFT JOIN (
    VALUES 
    ('R00000D','R12549D',1), 
    ('R20000D','R50000D',2), 
    ('R69154D','R99999D',3) 
) AS ORD(S,E,ORD) ON Note BETWEEN ORD.S AND ORD.E 
WHERE Note LIKE 'R%' 
ORDER BY COALESCE(ORD.ORD,4) ASC, Note 

注、これは終わりではなく、あなたの定義された範囲内の任意の項目を置きます。これはあなたが望むものかもしれません。あなたはそれを定義しませんでした。

+0

OPはハードコードされた境界ではなく、例を挙げました。 –

+0

あなたは何を意味するのか分かりません@DuduMarkovitz - 私は同じ質問を読むと信じています。彼がグループを望むならば、彼はgroup byステートメントでORD.ORDを使うことができます。この結合は、substr関数を使用するよりもはるかに高速です – Hogan

1

Windows機能をサポートするデータベースで使用します。 プロバイダごとに小さな変更が必要な場合があります。

デモ

create table SystemNote (Note char(7)); 

insert into SystemNote values 
('R00000D'),('R00001D'),('R00002D'),('R00003D'),('R00004D') 
,('R00012D'),('R00013D') 
,('R00015D'),('R00016D'),('R00017D'),('R00018D') 
,('R00021D') 
,('R00025D'),('R00026D'),('R00027D') 

select  min (Note) as from_Note 
      ,max (Note) as to_Note 
      ,count (*) as Notes 

from  (select  Note 
         ,row_number() over (order by Note) as rn 

      from  SystemNote 

      where  Note like 'R%' 
      ) sn 

group by cast (substr(Note,2,5) as int) - rn 

order by from_Note 

+-----------+---------+-------+ 
| from_note | to_note | notes | 
+-----------+---------+-------+ 
| R00000D | R00004D | 5  | 
+-----------+---------+-------+ 
| R00012D | R00013D | 2  | 
+-----------+---------+-------+ 
| R00015D | R00018D | 4  | 
+-----------+---------+-------+ 
| R00021D | R00021D | 1  | 
+-----------+---------+-------+ 
| R00025D | R00027D | 3  | 
+-----------+---------+-------+ 

select dense_rank() over (order by cast (substr(Note,2,5) as int)-rn) as group_id 
     ,row_number() over (partition by cast (substr(Note,2,5) as int)-rn order by note) as seq 
     ,min (Note) over (partition by cast (substr(Note,2,5) as int)-rn) as from_Note 
     ,max (Note) over (partition by cast (substr(Note,2,5) as int)-rn) as to_Note 
      ,Note 

from  (select  Note 
         ,row_number() over (order by Note) as rn 

      from  SystemNote 

      where  Note like 'R%' 
      ) sn 

order by Note 

+----------+-----+-----------+---------+---------+ 
| group_id | seq | from_note | to_note | note | 
+----------+-----+-----------+---------+---------+ 
| 1  | 1 | R00000D | R00004D | R00000D | 
+----------+-----+-----------+---------+---------+ 
| 1  | 2 | R00000D | R00004D | R00001D | 
+----------+-----+-----------+---------+---------+ 
| 1  | 3 | R00000D | R00004D | R00002D | 
+----------+-----+-----------+---------+---------+ 
| 1  | 4 | R00000D | R00004D | R00003D | 
+----------+-----+-----------+---------+---------+ 
| 1  | 5 | R00000D | R00004D | R00004D | 
+----------+-----+-----------+---------+---------+ 
| 2  | 1 | R00012D | R00013D | R00012D | 
+----------+-----+-----------+---------+---------+ 
| 2  | 2 | R00012D | R00013D | R00013D | 
+----------+-----+-----------+---------+---------+ 
| 3  | 1 | R00015D | R00018D | R00015D | 
+----------+-----+-----------+---------+---------+ 
| 3  | 2 | R00015D | R00018D | R00016D | 
+----------+-----+-----------+---------+---------+ 
| 3  | 3 | R00015D | R00018D | R00017D | 
+----------+-----+-----------+---------+---------+ 
| 3  | 4 | R00015D | R00018D | R00018D | 
+----------+-----+-----------+---------+---------+ 
| 4  | 1 | R00021D | R00021D | R00021D | 
+----------+-----+-----------+---------+---------+ 
| 5  | 1 | R00025D | R00027D | R00025D | 
+----------+-----+-----------+---------+---------+ 
| 5  | 2 | R00025D | R00027D | R00026D | 
+----------+-----+-----------+---------+---------+ 
| 5  | 3 | R00025D | R00027D | R00027D | 
+----------+-----+-----------+---------+---------+ 
関連する問題