SQL查询中重复字段的识别
我有一个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
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专家可以尝试一下,并告诉我它在逻辑上是否正确,我将不胜感激。对我来说,它看起来不错,我测试得很认真。