我有一个oracle表值如下。
UserName Password Application
============== ================ ===============
John cat gmail
John cat ldap
John dog yahoo
John dog fusion
Rick boat oracle
Rick mat gmail
Rick boat yahoo
Joe lilly gmail
Joe lilly yahoo
Joe lilly oracle
我想查询具有不同密码的用户及其计数。我希望得到以下结果。
John cat 2
John dog 2
Rick boat 2
Rick mat 1
答案 0 :(得分:1)
查询1 :
WITH password_counts AS (
SELECT DISTINCT
UserName,
Password,
COUNT( DISTINCT Password ) OVER ( PARTITION BY UserName ) AS number_of_passwords,
COUNT( Password ) OVER ( PARTITION BY UserName, Password ) AS count_per_password
FROM SecurityHole
)
SELECT UserName,
Password,
count_per_password
FROM password_counts
WHERE number_of_passwords > 1
ORDER BY UserName, Password
<强> Results 强>:
| USERNAME | PASSWORD | COUNT_PER_PASSWORD |
|----------|----------|--------------------|
| John | cat | 2 |
| John | dog | 2 |
| Rick | boat | 2 |
| Rick | mat | 1 |
答案 1 :(得分:0)
这应该有效:
SELECT username,password,COUNT(*)
FROM t
WHERE username IN (SELECT username FROM t GROUP BY username HAVING COUNT(DISTINCT password>1))
GROUP by username,password
如果你使用with子句来阻止表被读取两次,你可以优化它。
答案 2 :(得分:0)
当然,技巧是知道如何组合查询的两个部分:
SELECT user_password.UserName, user_password.Password, COUNT(*)
FROM user_password
JOIN (SELECT UserName
FROM user_password
GROUP BY UserName
HAVING COUNT(DISTINCT Password) > 1) multiple_passwords
ON multiple_passwords.UserName = user_password.UserName
GROUP BY user_password.UserName, user_password.Password
ORDER BY user_password.UserName
(有一个working SQL Fiddle demo!)
子选择(内部查询)找到具有多个密码的UserName
(并且也获得唯一的行)。除此之外,它是标准的“重复输入次数”查询。
(顺便说一句,我希望这些不是真正的密码...... #shudders#)