SQL - 标记列中的连续值更改

时间:2017-11-16 00:14:39

标签: sql sql-server-2012

我会尽力解释我的问题。

我有一个类似于以下内容的数据集:

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提供了此视图)。

非常感谢您的协助。 :)

1 个答案:

答案 0 :(得分:2)

对于第一阶段,我将使用LEAD()然后这允许我找到(或不)状态发生变化的每一行。所以然后删除不需要的行,瞧!通过在幸存的行上使用ROW_NUMBER()来获得最终结果。

关于&#34;原始订单&#34;。您永远不应该依赖以可预测顺序存储的表行。下面我使用了一个&#34;技巧&#34;愚弄over clause申请一项实际上什么也不做的订单,并且希望&#34;希望&#34;行将按照所需的&#34;原始顺序&#34;,但这不能保证。在实践中它有效,但你真的不应该依赖它。在创建每一行时添加datetime / datetime2列。

SQL Fiddle

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 |