SQL查询 - 按查询分组

时间:2014-06-25 20:28:18

标签: mysql sql sql-server

我有以下查询:

SELECT directory_auth_id, first_name, last_name, COUNT(user_info.directory_auth_id) as Duplication 
    FROM user_info
GROUP BY directory_auth_id, first_name, last_name
HAVING COUNT(*) > 1
ORDER BY directory_auth_id ASC 

这给了我想要的结果,并向我显示符合条件的所有记录。它不做的是,向我显示所有记录..如何查看已匹配的所有记录。

谢谢, 德曼。

5 个答案:

答案 0 :(得分:1)

仅限SQL Server ...

要显示仅存在多次directory_auth_id的所有行,您必须确定哪个directory_auth_id有重复,然后将该结果集用作主表上的过滤器。

这将实现这一点。

;WITH DUPES 
AS
(
    SELECT directory_auth_id
    FROM user_info
    GROUP BY directory_auth_id
    HAVING COUNT(*) > 1
)

SELECT directory_auth_id, first_name, last_name
FROM user_info T1
JOIN DUPES T2 ON T1.directory_auth_id = T2.directory_auth_id

答案 1 :(得分:1)

假设SQL Server标记是正确的,最好的方法是使用窗口函数:

select ui.*
from (select ui.*, count(*) over (partition by directory_auth_id, first_name, last_name) as cnt
      from user_info ui
     ) ui
where cnt > 1
order by cnt desc, directory_auth_id, first_name, last_name;

不幸的是,MySQL不支持这种ANSI标准功能。但是还有其他方法可以解决这个问题。

答案 2 :(得分:0)

这可能适合你。

SELECT * FROM user_info where (directory_auth_id,first_name,last_name) in (
SELECT directory_auth_id, first_name, last_name
FROM user_info
GROUP BY directory_auth_id, first_name, last_name
HAVING COUNT(*) > 1
)
ORDER BY directory_auth_id ASC

答案 3 :(得分:0)

尝试以下操作,这会将您的查询置于内联视图中,然后根据三个相关字段连接到该视图。因此,您将从user_info获取具有多个(directory_auth_id,first_name,last_name)组合的行的所有记录。

select x.*
  from user_info x
  join (select directory_auth_id,
               first_name,
               last_name,
               count(*) as duplication
          from user_info
         group by directory_auth_id, first_name, last_name
        having count(*) > 1) y
    on x.directory_auth_id = y.directory_auth_id
   and x.first_name = y.first_name
   and x.last_name = y.first_name

答案 4 :(得分:0)

这适用于MSSQL:

select
  directory_auth_id,
  first_name,
  last_name,
  case when count(user_info.directory_auth_id)
            over (partition by directory_auth_id, first_name, last_name) > 1
       then count(user_info.directory_auth_id)
            over (partition by directory_auth_id, first_name, last_name)
  end as Duplication
from user_info;