我有一个简单的表:
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
这个查询会是什么样的?
答案 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使用双引号的标识符。)