SQL查询中重复字段的识别

SQL查询中重复字段的识别,sql,sql-server-2012,Sql,Sql Server 2012,我有一个SQL查询,返回如下列: foo ----------- 1200 1200 1201 1200 1200 1202 1202 1202 foo ID ---- ---- 1200 1 1200 1 1201 2 1200 3 1200 3 1202 4 1202 4 1202 4 它已经以特定的方式进行了排序,我想对该结果集执行另一个查询,以标识重复数据,如下所示: foo ----------- 1200 1200 1201 1200 1

我有一个SQL查询,返回如下列:

foo
-----------
1200
1200
1201
1200
1200
1202
1202
1202
foo    ID
----   ----
1200   1
1200   1
1201   2
1200   3
1200   3
1202   4
1202   4
1202   4
它已经以特定的方式进行了排序,我想对该结果集执行另一个查询,以标识重复数据,如下所示:

foo
-----------
1200
1200
1201
1200
1200
1202
1202
1202
foo    ID
----   ----
1200   1
1200   1
1201   2
1200   3
1200   3
1202   4
1202   4
1202   4
重要的是,第二组1200与第一组分开。每个OVER/PARTITION的变体似乎都想将这两个组合并在一起。是否有一种方法可以将分区窗口仅限于这些重复的组

编辑:
这是针对Microsoft SQL Server 2012的

这里有一种不用光标的方法


不确定这将是最快的结果

select main.num, main.id from
(select x.num,row_number() 
over (order by (select 0)) as id 
from (select distinct num from num) x) main
join 
(select num, row_number() over(order by (select 0)) as ordering
 from num) x2 on 
x2.num=main.num
order by x2.ordering
假设表num有一个包含数据的列num,则可以按顺序将num设置为原始查询的视图或with


请参见下面的

这是我的解决方案,使用光标和临时表来保存结果

DECLARE @foo INT
DECLARE @previousfoo INT = -1
DECLARE @id INT = 0
DECLARE @getid CURSOR

DECLARE @resultstable TABLE 
(
    primaryId INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
    foo INT,    
    id int null 
)

SET @getid = CURSOR FOR
SELECT originaltable.foo
FROM   originaltable

OPEN @getid
FETCH NEXT
FROM @getid INTO @foo
WHILE @@FETCH_STATUS = 0
BEGIN
    IF (@foo <> @previousfoo)
    BEGIN
        SET @id = @id + 1
    END

    INSERT INTO @resultstable VALUES (@foo, @id)
    SET @previousfoo = @foo

    FETCH NEXT
    FROM @getid INTO @foo
END

CLOSE @getid
DEALLOCATE @getid

你可以不用光标来做,但它看起来不太好,至少是我想到的。所以我假设你们有一个PK列,它对你们的主要值进行排序。 然后2我假设您有一个要设置的ID列

    create table tbl(foo int, pk int, id int);

    insert into tbl(foo, pk) values (1100, 5);
    insert into tbl(foo, pk) values (1200, 10);
    insert into tbl(foo, pk) values (1200, 20);
    insert into tbl(foo, pk) values (1201, 30);
    insert into tbl(foo, pk) values (1200, 40);
    insert into tbl(foo, pk) values (1200, 50);

    insert into tbl(foo, pk) values (1202, 60);
    insert into tbl(foo, pk) values (1202, 70);
    insert into tbl(foo, pk) values (1202, 80);
    insert into tbl(foo, pk) values (1202, 90);
SQL Fiddle在此:


您使用的是哪种数据库管理系统?博士后?Oracle?您的结果集有多大?您是否考虑过循环遍历结果集并创建ID?结果集相当小,最多可能只有几百个。我没有考虑过循环,我会用谷歌搜索它。是的,在这种情况下试试游标。返回结果集的SQL查询是什么?为了便于论证,我们可以假设它是按col2从表中选择col1吗?您还可以调整这个查询吗?如果这里的一些SQL专家可以尝试一下,并告诉我它在逻辑上是否正确,我将不胜感激。对我来说,它看起来不错,我测试得很认真。