2017-01-23 101 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 | 
+----------+-----+-----------+---------+---------+