在我有一个像这样的表的情况下:
int id (PK)
int staff_id
int skill_id
bit mainskill
我想为每位员工(由 Staff_id 表示)仅选择一条记录,列出他们的主要技能(由 mainskill 中的 (1) 表示)。如果不存在主要技能,我想返回该员工的任何技能记录。例如:
id staff_id skill_id mainskill
1 1 24 1
2 1 55 0
3 1 7 0
4 4 24 0
5 4 18 0
6 6 3 0
7 6 18 1
查询应返回:
id staff_id skill_id mainskill
1 1 24 1
4 4 24 0
7 6 18 1
我尝试了分组、DISTINCT 等的各种组合,但无法获得我想要的输出。任何帮助表示赞赏。
SQL Server 2005+,使用 CTE:
WITH rows AS (
SELECT t.id,
t.staff_id,
t.skill_id,
t.mainskill,
ROW_NUMBER() OVER (PARTITION BY t.staff_id ORDER BY t.mainskill DESC) AS rank
FROM TABLE t)
SELECT r.id,
r.staff_id,
r.skill_id,
r.mainskill
FROM rows r
WHERE r.rank = 1
ORDER BY r.staff_id
SQL Server 2005+,非 CTE 等效项:
SELECT r.id,
r.staff_id,
r.skill_id,
r.mainskill
FROM (SELECT t.id,
t.staff_id,
t.skill_id,
t.mainskill,
ROW_NUMBER() OVER (PARTITION BY t.staff_id ORDER BY t.mainskill DESC) AS rank
FROM TABLE t) r
WHERE r.rank = 1
ORDER BY r.staff_id
两者都使用ROW_NUMBER http://msdn.microsoft.com/en-us/library/ms186734.aspx,仅自 SQL Server 2005 起可用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)