通过SQL查找重复项并枚举结果

时间:2014-04-03 01:29:07

标签: sql duplicates

我有一个简单的表:

Hash    Filename
----    --------
qqq     fileq2   
aaa     filea2
bbb     fileb1
aaa     filea3
qqq     fileq1
aaa     filea1

对于不同的文件名(例如aaa和qqq),有些哈希值会出现多次,有些哈希值只出现一次(例如bbb)。

我想要一个查询,它返回任何具有重复值的哈希的哈希和文件名。到目前为止没问题。但我还希望输出包含枚举值以显示副本的实例编号。因此,使用上述数据,结果将是:

Instance    Hash    Filename
--------    ----    --------
       1    aaa     filea1             // Hash aaa occurs 3 times
       2    aaa     filea2
       3    aaa     filea3
       1    bbb     fileb1             // Hash bbb occurs once
       1    qqq     fileq1             // Hash qqq occurs twice
       2    qqq     fileq2

这个查询会是什么样的?

2 个答案:

答案 0 :(得分:3)

这里有一个sql小提示结果:http://sqlfiddle.com/#!6/9d6ca/1

select
  (select count(1) from data b where b.hash = a.hash and b.filename <= a.filename) as Instance,
  a.hash,
  a.filename
from data a
order by
  a.hash,
  a.filename

答案 1 :(得分:2)

使用MySQL,您可以“自己动手”#34;解析函数,利用MySQL用户变量,如下所示:

         SELECT IF(@prev_hash=s.hash,@i:=@i+1,@i:=1) AS `Instance`
              , @prev_hash := s.hash AS hash
              , h.Filename
           FROM ( SELECT @prev_hash := NULL, @i := NULL ) i
          CROSS
           JOIN ( SELECT d.hash
                    FROM simpletable d
                   GROUP BY d.hash
                  HAVING COUNT(1) > 1
                ) e
           JOIN simpletable s
             ON s.hash = e.hash
          ORDER BY s.hash, s.filename

使用Oracle,您可以使用ROW_NUMBER()解析函数,如下所示:

SELECT ROW_NUMBER() OVER (PARTITION BY t.HASH ORDER BY t.FILENAME) AS Instance
     , t.HASH
     , t.FILENAME
  FROM SIMPLETABLE t
  JOIN ( SELECT r.HASH
           FROM SIMPLETABLE r
          GROUP BY r.HASH
         HAVING COUNT(1) > 1
       ) s
    ON s.HASH = t.HASH 
 ORDER BY t.HASH, t.FILENAME

我认为SQL Server语法与Oracle完全相同(除了SQL Server使用方括号围绕Oracle使用双引号的标识符。)