我会尽力解释我的问题。
我有一个类似于以下内容的数据集:
Row# CusCode Status
1 100101 Green
2 100101 Green
3 100101 Red
4 100101 Amber
5 100101 Amber
6 100101 Green
7 100101 Red
8 100101 Red
9 100101 Red
10 200909 Red
11 200909 Amber
12 200909 Green
13 200909 Red
我正在尝试将此视图作为下一步:
Row# CusCode Status Required
1 100101 Green 1
2 100101 Green 1
3 100101 Red 2
4 100101 Amber 3
5 100101 Amber 3
6 100101 Green 4
7 100101 Red 5
8 100101 Red 5
9 100101 Red 5
10 200909 Red 1
11 200909 Amber 2
12 200909 Green 3
13 200909 Red 4
最后一步是让数据集看起来如下:
CusCode Status Required
100101 Green 1
100101 Red 2
100101 Amber 3
100101 Green 4
100101 Red 5
200909 Red 1
200909 Amber 2
200909 Green 3
200909 Red 4
请注意以下事项:
我要求根据状态更改创建计数器,无论状态是否更改为先前状态,意图是标记连续的重复记录 - 表2提供了此示例。
< / LI>数据集包含多个记录
显示状态的顺序最重要,必须以相同的顺序输出(表3提供了此视图)。
非常感谢您的协助。 :)
答案 0 :(得分:2)
对于第一阶段,我将使用LEAD()
然后这允许我找到(或不)状态发生变化的每一行。所以然后删除不需要的行,瞧!通过在幸存的行上使用ROW_NUMBER()
来获得最终结果。
关于&#34;原始订单&#34;。您永远不应该依赖以可预测顺序存储的表行。下面我使用了一个&#34;技巧&#34;愚弄over clause
申请一项实际上什么也不做的订单,并且希望&#34;希望&#34;行将按照所需的&#34;原始顺序&#34;,但这不能保证。在实践中它有效,但你真的不应该依赖它。在创建每一行时添加datetime / datetime2列。
MS SQL Server 2014架构设置:
CREATE TABLE Table1
([RowNo] int, [CusCode] int, [Status] varchar(5))
;
INSERT INTO Table1
([RowNo], [CusCode], [Status])
VALUES
(1, 100101, 'Green'),
(2, 100101, 'Green'),
(3, 100101, 'Red'),
(4, 100101, 'Amber'),
(5, 100101, 'Amber'),
(6, 100101, 'Green'),
(7, 100101, 'Red'),
(8, 100101, 'Red'),
(9, 100101, 'Red'),
(10, 200909, 'Red'),
(11, 200909, 'Amber'),
(12, 200909, 'Green'),
(13, 200909, 'Red')
;
删除查询:
with CTE as (
select
*
, lead(status) over(partition by CusCode order by (select 1)) nxt_status
from table1
)
delete from CTE
where status = nxt_status
;
检查查询
with CTE as (
select
*
, row_number() over(partition by CusCode order by (select 1)) rn
from table1
)
select
*
from CTE
;
<强> Results 强>:
| RowNo | CusCode | Status | rn |
|-------|---------|--------|----|
| 2 | 100101 | Green | 1 |
| 3 | 100101 | Red | 2 |
| 5 | 100101 | Amber | 3 |
| 6 | 100101 | Green | 4 |
| 9 | 100101 | Red | 5 |
| 10 | 200909 | Red | 1 |
| 11 | 200909 | Amber | 2 |
| 12 | 200909 | Green | 3 |
| 13 | 200909 | Red | 4 |