我正在与一个岛屿和海峡地区进行斗争"问题。这适用于SQL Server 2008/2012(我们都有数据库)。
我有一张跟踪"可用" Serial - #'用于Pass Outlet;即,巴斯通行证,入场门票,迪斯尼乐园门票等。这些序列号是VARCHAR
,可以是数字和字符的任意组合......任何长度,最大值可达已定义的列... VARCHAR(30)
。这就是我在VIEW的语法/设计上挣扎的地方。
包含所有这些数据的表(IM_SER
)的主键包含:
ITEM_NO...VARCHAR(20),
SERIAL_NO...VARCHAR(30)
在许多情况下......特别是对于不同类型的" Bus Passes"参与其中,那些Serial - #可以很容易地追踪到成千上万的TENS。所需要的......是SQL Server中的简单视图......它只输出可用串行的连续范围 - #...直到找到GAP(即序列中的BREAK)。例如,假设我们有以下序列 - #' s对于给定的项目 - #:
123
124
125
139
140
ABC123
ABC124
ABC126
XYZ240003
XYY240004
在上面的示例中,输出将显示如下:
123 -to- 125
139 -to- 140
ABC123 -to- ABC124
ABC126 -to- ABC126
XYZ240003 to XYZ240004
总共会有10个Serial - #'但由于我们正在输出顺序范围 ...只有5行输出必要。这有意义吗?请让我知道......再次,谢谢!...马克
答案 0 :(得分:0)
这应该让你开始......有趣的部分将确定是否存在差距。您将不得不稍微区别地处理每个串行格式以确定是否存在间隙...
select x.item_no,x.s_format,x.s_length,x.serial_no,
LAG(x.serial_no) OVER (PARTITION BY x.item_no,x.s_format,x.s_length
ORDER BY x.item_no,x.s_format,x.s_length,x.serial_no) PreviousValue,
LEAD(x.serial_no) OVER (PARTITION BY x.item_no,x.s_format,x.s_length
ORDER BY x.item_no,x.s_format,x.s_length,x.serial_no) NextValue
from
(
select item_no,serial_no,
len(serial_no) as S_LENGTH,
case
WHEN PATINDEX('%[0-9]%',serial_no) > 0 AND
PATINDEX('%[a-z]%',serial_no) = 0 THEN 'NUMERIC'
WHEN PATINDEX('%[0-9]%',serial_no) > 0 AND
PATINDEX('%[a-z]%',serial_no) > 0 THEN 'ALPHANUMERIC'
ELSE 'ALPHA'
end as S_FORMAT
from table1 ) x
order by item_no,s_format,s_length,serial_no
http://sqlfiddle.com/#!3/5636e2/7
| item_no | s_format | s_length | serial_no | PreviousValue | NextValue |
|---------|--------------|----------|-----------|---------------|-----------|
| 1 | ALPHA | 4 | ABCD | (null) | ABCF |
| 1 | ALPHA | 4 | ABCF | ABCD | (null) |
| 1 | ALPHANUMERIC | 6 | ABC123 | (null) | ABC124 |
| 1 | ALPHANUMERIC | 6 | ABC124 | ABC123 | ABC126 |
| 1 | ALPHANUMERIC | 6 | ABC126 | ABC124 | (null) |
| 1 | ALPHANUMERIC | 9 | XYY240004 | (null) | XYZ240003 |
| 1 | ALPHANUMERIC | 9 | XYZ240003 | XYY240004 | (null) |
| 1 | NUMERIC | 3 | 123 | (null) | 124 |
| 1 | NUMERIC | 3 | 124 | 123 | 125 |
| 1 | NUMERIC | 3 | 125 | 124 | 139 |
| 1 | NUMERIC | 3 | 139 | 125 | 140 |
| 1 | NUMERIC | 3 | 140 | 139 | (null) |