Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅选择基于少数列的重复记录_Sql_Sql Server - Fatal编程技术网

Sql 仅选择基于少数列的重复记录

Sql 仅选择基于少数列的重复记录,sql,sql-server,Sql,Sql Server,我有一个有三列的表。它在第2列和第3列上有重复项。我需要只选择重复的行(包括所有3列)。怎么做?请帮帮我 var1 var2 var3 a b a c a a d b 电子商务 以上是表格结构。它有3个列n var1,var2,var3。仅基于var2和var3列,我们必须假设它是重复记录。我们不应该考虑VAR1,而找到副本。对不起,路线不对 我使用了下面的查询来获取所有行,其中包含/不包含重复的行,但是使用秩来标识重复的记录。但我不能只得到重复的记录 选择var1、var2、var3、行号()

我有一个有三列的表。它在第2列和第3列上有重复项。我需要只选择重复的行(包括所有3列)。怎么做?请帮帮我

var1 var2 var3

a
b a
c a a
d b
电子商务

以上是表格结构。它有3个列n var1,var2,var3。仅基于var2和var3列,我们必须假设它是重复记录。我们不应该考虑VAR1,而找到副本。对不起,路线不对

我使用了下面的查询来获取所有行,其中包含/不包含重复的行,但是使用秩来标识重复的记录。但我不能只得到重复的记录

选择var1、var2、var3、行号()覆盖(按分区)
var2,var3由var2,var3)作为rnk订购
来自vart

除此之外,我如何获得重复条目中的最大排名记录?
谢谢。

您的主键是什么?如果var1是,请尝试:

select var1
from vart
group by var2+var3
having count(*)>1
如果不是,请尝试:

select * from vart where pk in
(
    select pk
    from vart
    group by var2+var3
    having count(*)>1
)

如果您想要所有重复的行,可以使用
count(*)over()

结果:

var1 var2 var3
---- ---- ----
a    a    a
b    a    a
c    a    a
var1 var2 var3
---- ---- ----
b    a    a
c    a    a
如果您想要所有副本,但只需要一个,请使用
行号()over()

select var1, var2, var3
from (
      select var1,
             var2,
             var3,
             row_number() over(partition by var2, var3 order by var1) as rn
      from YourTable
     ) as T
where rn > 1
结果:

var1 var2 var3
---- ---- ----
a    a    a
b    a    a
c    a    a
var1 var2 var3
---- ---- ----
b    a    a
c    a    a

使用您的查询,您可以使用CTE展开它并执行您想要的操作

with cte as
(
select var1,var2,var3,ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart
)
select * from cte where rnk > 1
这将列出所有“重复”行

您也可以使用cte删除复制:

with cte as
(
select ROW_NUMBER() over(PARTITION BY var2,var3 order by var2,var3) as rnk from vart
)
delete from cte where rnk > 1

列“vart.var1”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。请修改查询。但这可能有点低效。我不知道如何在in子句中有多个字段