sql查询打印具有不同密码及其计数的用户

时间:2013-12-07 11:05:57

标签: sql oracle

我有一个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

3 个答案:

答案 0 :(得分:1)

SQL Fiddle

查询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#)