代码
CREATE TABLE #Temp (ValA varchar(10) NULL, FK_ID int)
INSERT INTO #Temp
SELECT 'A',1
UNION ALL
SELECT 'A',1
UNION ALL
SELECT 'A',1
UNION ALL
SELECT 'A',2
UNION ALL
SELECT 'B',1
UNION ALL
SELECT 'B',2
UNION ALL
SELECT 'C',1
UNION ALL
SELECT 'C',1
UNION ALL
SELECT 'C',1
SELECT
ValA
, FK_ID
, CASE WHEN COUNT(*) OVER (PARTITION BY ValA, FK_ID) > 1 THEN 1
ELSE 0
END IsMultiple
FROM #Temp
DROP TABLE #Temp
当前输出
ValA FK_ID IsMultiple
A 1 1
A 1 1
A 1 1
A 2 0
B 1 0
B 2 0
C 1 1
C 1 1
C 1 1
期望输出
ValA FK_ID IsMultiple
A 1 1
A 1 1
A 1 1
A 2 **1**
B 1 0
B 2 0
C 1 1
C 1 1
C 1 1
目标 我想找到由ValA和FK_ID分区的多个,但是对于那些ValA重复并且FK_ID中至少有两个重复的那些(至少有一个不重复),我希望将它们标记为1(IsMultiple)。
即。 ValA-A有4条记录,其中3条记录具有相同的FK_ID但是一条不同的FK_ID,整个集合应标记为IsMultiple = 1
谢谢
答案 0 :(得分:4)
如果NULL
FK_ID
值
SELECT
ValA
, FK_ID
, CASE WHEN COUNT(*) OVER (PARTITION BY ValA) >
dense_rank() OVER (PARTITION BY ValA ORDER BY FK_ID ASC) + dense_rank() OVER (PARTITION BY ValA ORDER BY FK_ID DESC) -1 -- Get Distinct FK_ID Count
THEN 1
ELSE 0
END IsMultiple
FROM Temp
答案 1 :(得分:3)
不太优雅但有效:
select
t.*,
case when tex.ValA is null
then 0
else 1
end IsMultiple
from #Temp t
left join (
select
ValA
from #Temp
group by
ValA, FK_ID
having
count(*) > 1
) tex on
t.ValA = tex.ValA
在内部查询中,我们选择具有多个相同对的ValAs(ValA,FK_ID) - 通过分组(ValA,FG_ID)并仅使用having count(*) > 1
来实现。
然后在左连接中,我们使用此集标记具有相应ValAs的记录为IsMultiple。
答案 2 :(得分:0)
这可以告诉您ValA的哪些值可以充分利用您已经完成的任务。
SELECT
a.ValA
,CONVERT(BIT,sum(IsMultiple))
FROM (
SELECT
ValA
, FK_ID
, CASE WHEN COUNT(*) OVER (PARTITION BY ValA, FK_ID) > 1 THEN 1
ELSE 0
END IsMultiple
FROM #Temp
) a
group by a.ValA