SQL有助于按组和计数查找唯一对

时间:2017-07-19 01:12:52

标签: sql sql-server

需要一些SQL帮助,可能使用组和计数,或者它需要的任何东西。只是找不到方法。非常感谢。

一个简单的表格:

ColA  ColB
  2     B
  3     B
  4     C
  5     C

返回所有独特的ColA和ColB对,其中对于相同的ColB,还有更多 而不是一个不同的ColA值。

对于上面给出的数据,它将返回

$ionicScrollDelegate.scrollBottom(true);

4 个答案:

答案 0 :(得分:0)

编辑:对第一个答案抱歉,我没有注意到你对ColA的规定在ColB之间有多个不同的值。这是我更新的答案:

SELECT ColA, ColB
FROM test
WHERE EXISTS (
    SELECT ColB
    FROM test AS subtest
    WHERE test.ColB = subtest.ColB
    GROUP BY ColB
    HAVING COUNT(DISTINCT ColA) > 1
)
GROUP BY ColA, ColB

答案 1 :(得分:0)

您可以使用VS 2013来检查APPLY是否有超过1个ColBColA值的消息:

WITH Cte(ColA, ColB) AS(
    SELECT * FROM( VALUES
        (1, 'A'), (1, 'A'), (2, 'B'), (3, 'B'), (4, 'C'), (4, 'C'), (5, 'C')
    ) t(a,b)
)
SELECT DISTINCT c1.*
FROM Cte c1
CROSS APPLY(
    SELECT COUNT(*) AS cnt
    FROM Cte c2
    WHERE
        c2.ColB = c1.ColB
        AND c2.ColA <> c1.ColA
    GROUP BY c2.ColB
    HAVING COUNT(*) > 0
) x

ONLINE DEMO

答案 2 :(得分:0)

首先使用Group By Clause和Row_Number()我将得到一个数字序列结果集。通过这种方式,我可以识别ColumnA和ColumnB的唯一对,其中对于相同的ColumnB,有多个不同的ColumnA值。

Select
    ColumnA,
    ColumnB,
    Row_Number() Over(Partition By ColumnB Order By ColumnA) As RowNum
From SimpleTable
Group By ColumnB, ColumnA;

输出:

ColumnA ColumnB RowNum
1       A       1
2       B       1
3       B       2
4       C       1
5       C       2

现在您可以将此结果放入表表达式 - CTE或派生表(我选择CTE)并仅过滤掉RowNum大于或等于2的ColumnB值。因此,最终查询将是 -

;With CTE
As
(
    Select
        ColumnA,
        ColumnB,
        Row_Number() Over(Partition By ColumnB Order By ColumnA) As RowNum
    From SimpleTable
    Group By ColumnB, ColumnA
)
Select ColumnA, ColumnB From CTE
Where ColumnB In (Select ColumnB From CTE Where RowNum >=2)
Order By ColumnA, ColumnB;

最终输出:

ColumnA ColumnB
2       B
3       B
4       C
5       C

希望这有用:)

答案 3 :(得分:0)

我建议使用min()max()作为窗口函数的简单方法:

select colA, colB
from (select t.*,
             min(colA) over (partition by colB) as mincolA,
             max(colA) over (partition by colB) as maxcolA
      from t
     ) t
where mincolA <> maxcolA;