2017-01-23 123 views
0

SQL查詢的一個新問題,請原諒我順序SQL查詢

任何簡單SQL查詢的線索?我試圖對一系列數據中斷的結果進行排序。

如R00000D到R99999D。

然而一些數量的已經以無順序示例R00000D分配給R12549D然後下一個序列是R200001D到R50000D。

所以我想組這些塊

R00000D to R12549D 
R20000D to R50000D 
R69154D to R99999D 

,我已經能夠做的是導出到Excel和長篇大論的方式和計算列的唯一途徑。

我開始查詢是一個簡單的

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

您好,我使用的是SQL服務器 – DJR

回答

1

我會做一個表,您的訂購需求,並加入到它 - 這可以讓你修改表如果你的要求而改變。在這裏,我將它作爲一個內聯表格,但是你可以有一個實際的表格或CTE。

此代碼應與稍作修改大多數平臺上工作。我知道它將適用於DB2,我相信Oracle。不確定值語句是否在SQL Server中有效。您可能需要更改爲SELECT/UNION ALLs。

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 - 我相信我們讀了同樣的問題。如果他想要一個小組,他可以在小組中使用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 | 
+----------+-----+-----------+---------+---------+