带有多个列的SQL Group By - 返回组合大于1的所有行

时间:2014-07-22 14:12:40

标签: sql sql-server

我有一张包含以下数据的表格:

sequence    subSequence    Note
1           1              'A'
1           2              'B'
2           1              'C'
2           4              'D'
2           4              'E'
2           3              'F'
3           3              'G'
3           3              'H'
3           3              'I'

以下查询返回sequence和subSequence组合大于1的行。

SELECT sequence,subSequence,count(*) AS _rowCount
FROM [MyTable]
GROUP BY sequence,subSequence
HAVING count(*)>1

结果:

sequence subSequence _rowCount
2        4           2
3        3           3

我想返回序列和子序列组合大于1的所有行。

结果:

sequence subSequence Note
2        4           'D'
2        4           'E'
3        3           'G'
3        3           'H'
3        3           'I'

我已尝试过以下查询,但执行时间过了很长时间,而且我不确定它是否正确。因此,我需要帮助优化它,或者纠正它或任何其他查询:

SELECT *
FROM [MyTable]
WHERE sequence IN
        (SELECT sequence
        FROM [MyTable]
        GROUP BY sequence,subSequence
        HAVING count(*)>1)
    AND subSequence IN
        (SELECT subSequence
        FROM [MyTable]
        GROUP BY sequence,subSequence
        HAVING count(*)>1)

2 个答案:

答案 0 :(得分:1)

SELECT [MyTable].*, MySubQuery.rowCount
FROM [MyTable]
JOIN (
    SELECT sequence,subSequence,count(*) AS rowCount
    FROM [MyTable]
    GROUP BY sequence,subSequence
    HAVING count(*)>1
) As MySubQuery
ON MySubQuery.sequence = [MyTable].sequence
AND MySubQuery.subSequence= [MyTable].subSequence

使用子查询并加入它。

如果这仍然很慢,我建议在sequence,subSequence上创建索引,如下所示:

 ALTER TABLE [MyTable]
 ADD INDEX idxSeqSubSeq (sequence,subSequence);

这将让数据库引擎利用索引来避免查看它不需要考虑的行。

答案 1 :(得分:1)

使用窗口功能:

SELECT t.*
FROM (SELECT t.*,
             COUNT(*) OVER (PARTITION BY sequence, subSequence) AS rowCount
       FROM [MyTable]
     ) t
WHERE rowCount > 1;