SQL使用GROUP BY选择包含空字段的行,具有COUNT

SQL使用GROUP BY选择包含空字段的行,具有COUNT,sql,sql-server,group-by,having,Sql,Sql Server,Group By,Having,我正在尝试做的与 但除了选择按数字顺序描述后的第一行之外,我想选择一行在数据库中多次显示(过去已更改名称),并在Change_name_to下选择空字段 例如,我有一个表,显示人员的姓名更改历史和当前姓名 +--------+--------------+----------------+ | UserID | Current_Name | Change_Name_to | +--------+--------------+----------------+ | 30 | Name3

我正在尝试做的与

但除了选择按数字顺序描述后的第一行之外,我想选择一行在数据库中多次显示(过去已更改名称),并在Change_name_to下选择空字段

例如,我有一个表,显示人员的姓名更改历史和当前姓名

+--------+--------------+----------------+
| UserID | Current_Name | Change_Name_to |
+--------+--------------+----------------+
|     30 | Name3        |                |
|     30 | Name2        | Name3          |
|     30 | Name1        | Name2          |
|     10 | Name5        |                |
|     20 | Name7        |                |
|     20 | Name6        | Name7          |
+--------+--------------+----------------+
我想在这里做的是

+--------+--------------+----------------+
| UserID | Current_Name | Change_Name_to |
+--------+--------------+----------------+
|     30 | Name3        |                |
|     20 | Name7        |                |
+--------+--------------+----------------+
我该怎么做

SELECT *, COUNT(*) FROM `docs` GROUP BY id HAVING COUNT(UserID) > 1

我明白这是行不通的,但像这样的事情是我想做的。

我想你可以用以下方法做你想做的事情:

select d.*
from docs d
where d.change_name_to is null and
      exists (select 1
              from docs d2
              where d2.userid = d.userid and d2.change_name_to is not null
             );

根据这些样本数据,您所需要的只是

select * 
from docs d
where d.change_name_to is null
and UserID in (select UserID from docs group by UserID having count(UserID) > 1)
检查下一个:

SELECT
  l.UserID, l.Current_Name, l.Change_Name_to
FROM @docs l JOIN @docs r
  ON l.UserID = r.UserID AND
     l.Current_Name = r.Change_Name_to
WHERE l.Change_Name_to IS NULL AND
      r.Change_Name_to IS NOT NULL;

这正是我要找的。非常感谢,我一看到你的问题就很清楚,很容易理解。