SQL Server:如何查找重复的行值
我想找到一个重复的数字超过4行的值 如果你必须找到一个重复四次以上的数字,而不是在其他数字的组合中重复四次以上 此表为test2:SQL Server:如何查找重复的行值,sql,sql-server,Sql,Sql Server,我想找到一个重复的数字超过4行的值 如果你必须找到一个重复四次以上的数字,而不是在其他数字的组合中重复四次以上 此表为test2: num1 num2 num3 num4 num5 numb6 -------------------------------------- 1 1 1 2 3 4 1 1 1 1 3 4 1 2 3 4 5 6 1
num1 num2 num3 num4 num5 numb6
--------------------------------------
1 1 1 2 3 4
1 1 1 1 3 4
1 2 3 4 5 6
1 2 2 1 4 5
我的SQL查询:
-- CTE
;WITH TEMP(num1, num2, num3, num4, num5, num6) AS
(
SELECT
RIGHT(num1) AS num1,
RIGHT(num2) AS num2,
RIGHT(num3) AS num3,
RIGHT(num4) AS num4,
RIGHT(num5) AS num5,
RIGHT(num6) AS num6
FROM
test2
)
-- select duplicate number
SELECT
num1, num2, num3,
num4, num5, num6,
COUNT (CASE
WHEN num1 IN (num2, num3, num4, num5, num6)
THEN 1
END) +
COUNT (CASE
WHEN num2 IN (num3, num4, num5, num6)
THEN 1
END) +
COUNT (CASE
WHEN num3 IN (num4, num5, num6)
THEN 1
END) +
COUNT (CASE
WHEN num4 IN (num5, num6)
THEN 1
END) +
COUNT (CASE
WHEN num5IN (num6)
THEN 1
END) AS countNum
FROM
TEMP
GROUP BY
num1, num2, num3, num4, num5, num6
我得到的结果如下:
num1 num2 num3 num4 num5 numb6 countNum
----------------------------------------------
1 1 1 1 3 4 4
1 2 2 1 4 5 4
但是我需要得到这个:
num1 num2 num3 num4 num5 numb6 countNum
----------------------------------------------
1 1 1 1 3 4 4
或者我需要数据
num1 num2 num3 num4 num5 numb6
------------------------------------
1 1 1 1 3 4
您可以尝试以下解决方案:
;with temp_data as (
select 1 as num1 , 1 as num2 , 1 as num3 , 2 as num4 , 3 as num5 , 4 as num6 union all
select 1 as num1 , 1 as num2 , 1 as num3 , 1 as num4 , 3 as num5 , 4 as num6 union all
select 2 as num1 , 2 as num2 , 2 as num3 , 3 as num4 , 2 as num5 , 6 as num6
)
SELECT *
FROM temp_data
where 3=(CASE WHEN num1=num2 THEN 1 ELSE 0 END)+
(CASE WHEN num1=num3 THEN 1 ELSE 0 END)+
(CASE WHEN num1=num4 THEN 1 ELSE 0 END)+
(CASE WHEN num1=num5 THEN 1 ELSE 0 END)+
(CASE WHEN num1=num6 THEN 1 ELSE 0 END)
OR
3=(CASE WHEN num2=num1 THEN 1 ELSE 0 END)+
(CASE WHEN num2=num3 THEN 1 ELSE 0 END)+
(CASE WHEN num2=num4 THEN 1 ELSE 0 END)+
(CASE WHEN num2=num5 THEN 1 ELSE 0 END)+
(CASE WHEN num2=num6 THEN 1 ELSE 0 END)
OR
3=(CASE WHEN num3=num1 THEN 1 ELSE 0 END)+
(CASE WHEN num3=num2 THEN 1 ELSE 0 END)+
(CASE WHEN num3=num4 THEN 1 ELSE 0 END)+
(CASE WHEN num3=num5 THEN 1 ELSE 0 END)+
(CASE WHEN num3=num6 THEN 1 ELSE 0 END)
OR
3=(CASE WHEN num4=num1 THEN 1 ELSE 0 END)+
(CASE WHEN num4=num3 THEN 1 ELSE 0 END)+
(CASE WHEN num4=num2 THEN 1 ELSE 0 END)+
(CASE WHEN num4=num5 THEN 1 ELSE 0 END)+
(CASE WHEN num4=num6 THEN 1 ELSE 0 END)
OR
3=(CASE WHEN num5=num1 THEN 1 ELSE 0 END)+
(CASE WHEN num5=num2 THEN 1 ELSE 0 END)+
(CASE WHEN num5=num4 THEN 1 ELSE 0 END)+
(CASE WHEN num5=num3 THEN 1 ELSE 0 END)+
(CASE WHEN num5=num6 THEN 1 ELSE 0 END)
OR
3=(CASE WHEN num6=num1 THEN 1 ELSE 0 END)+
(CASE WHEN num6=num2 THEN 1 ELSE 0 END)+
(CASE WHEN num6=num4 THEN 1 ELSE 0 END)+
(CASE WHEN num6=num3 THEN 1 ELSE 0 END)+
(CASE WHEN num6=num5 THEN 1 ELSE 0 END)
;
输出:
num1 num2 num3 num4 num5 num6
1 1 1 1 3 4
2 2 2 3 2 6
使用以下代码:这可能会帮助您
select num1,num2,num3,num5 from dup
group by num1,num2,num3,num5
having count(num1)>1 and count(num2)>1 and count(num3)>1 and count(num5)>1
使用
应用
select t.*, v.cnt
from t cross apply
(select top (1) num, count(*) as cnt
from (values (num1), (num2), (num3), (num4), (num5), (num6)
) v(num)
group by num
order by count(*) desc
) v
where v.cnt >= 4;
这不仅比大量的
case
表达式更不容易出错。它甚至可以有更好的性能。有固定的6列??哪些列?num1,num2,num3,num4,num5,num6?到目前为止你都试过什么?添加您当前的sql查询。这六列是固定的。@seungyong。“这比必要的要复杂得多。”戈登·林诺夫我也这么认为。我想知道一个更简单的方法。我得到消息“无法绑定多部分标识符”v.cnt。“我将“where num>4”更改为“where cnt>4”,我可以得到我想要的值。