分组重复数据

标记1234

使用SQl2008 R2。我有大量的记录(100k),这些记录按特定顺序排序(我在示例数据中使用了ID)。我必须保持这个顺序

每当设置字段更改时,我都希望增加组。我以为使用窗口函数会很容易,但是我被卡住了

我的数据是

身份证号码
1 A 1 
2 B 2 
3 B 2 
4 B 2 
5 A 1

要求的结果是

ID字母编号组ID 
1 A 1 1 
2 B 2 2 
3 B 2 2 
4 B 2 2 
5 A 1 3

基本上,当Col1和Col2的组合更改为“何时排序”时,我想增加groupno。即,即使第1行和第5行都包含A 1,它们也必须具有唯一的GroupNo,因为它们被2、3、4插补了

(我的真实数据包含几个需要比较的字段)

 -- Create tables to work with / Source and Destination
CREATE TABLE #Items
    (
     ID INT 
    ,Letter VARCHAR(1)
    ,Number INT
    )

CREATE TABLE #Results
    (
     ID INT 
    ,Letter VARCHAR(1)
    ,Number INT
    ,GroupID int
    )


INSERT INTO #Items
        ( ID,Letter, Number )
SELECT 1, 'A', 1
UNION
SELECT 2, 'B', 2
UNION
SELECT 3,'B', 2
UNION
SELECT 4, 'B', 2
UNION
SELECT 5, 'A', 1

SELECT * FROM #Items
ORDER BY ID

INSERT INTO #Results
        ( ID,Letter, Number, GroupID )
SELECT 1, 'A', 1, 1
UNION
SELECT 2, 'B', 2,2
UNION
SELECT 3,'B', 2,2
UNION
SELECT 4, 'B', 2,2
UNION
SELECT 5, 'A', 1,3

提前致谢

标记

戈登·利诺夫(Gordon Linoff)

解决此问题的一种简单方法是两个行号之差。这唯一地标识每个值序列。然后使用dense_rank()这是查询:

select ID, Letter, Number,
       dense_rank() over (order by diff, letter) as GroupId
from (select i.*,
             (row_number() over (order by id) -
              row_number() over (partition by letter order by id)
             ) as diff
      from #items i
     ) t

根据您的数据,行号,差异和最终值如下所示:

ID  Letter  Number   RN-ID  RN-Letter  Diff   GroupId
1      A       1       1       1         0       1
2      B       2       2       1         1       2
3      B       2       3       2         1       2
4      B       2       4       3         1       2
5      A       1       5       2         3       3

瞧!几乎像魔术。

是有关SQL Fiddle的示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章