T-SQL |找到倍数(扭曲?!)

时间:2015-09-09 16:34:33

标签: sql sql-server tsql sql-server-2012

代码

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

谢谢

3 个答案:

答案 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