2015-09-09 40 views
3

代码T-SQL |查找倍数(与扭曲?!)

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 

目标 我想找到瓦拉和FK_ID分割倍数但对于那些ValA正在重复并且至少有2个FK_ID正在重复的情况(至少有另外一个没有),我希望那些t o被标记为1(IsMultiple)。

即瓦拉 - 一个有4条,其中3条具有相同FK_ID但一个不同FK_ID,整套应标记为IsMultiple = 1

谢谢

回答

4

如果你没有在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

好的,只是upvoted你:) – Shiva

+0

逻辑去创造这个查询是非常恶心。谢谢。因为我很努力地理解这个查询,如果我必须使ValA = A为IsMultiple的0,我将如何去改变它? (看着个人聚合fx的..) – 007

+0

排名fx的*:D – 007

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其中有多个相同的对(瓦拉,FK_ID) - 它是由上(瓦拉,FG_ID)分组,并只与having count(*) > 1服用实现。
然后,在左连接中,我们使用该集合将相应ValAs的记录标记为IsMultiple。

+1

NULL价值,不预期工作。另外,非常感谢xplanaiton帮助我理解。干杯! – 007

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 
+0

这是正确的和有意的。我看到了期望的输出结果,但因为想要知道的信息实际上是我的查询显示的内容,所以采取了一些自由度。 – UnhandledExcepSean

+0

感谢您的意见,这可能会更方便。干杯! – 007