SQL使用GROUP BY选择包含空字段的行,具有COUNT
我正在尝试做的与 但除了选择按数字顺序描述后的第一行之外,我想选择一行在数据库中多次显示(过去已更改名称),并在Change_name_to下选择空字段 例如,我有一个表,显示人员的姓名更改历史和当前姓名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
+--------+--------------+----------------+
| 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;
这正是我要找的。非常感谢,我一看到你的问题就很清楚,很容易理解。