use*_*133 4 sql t-sql sql-server ranking sql-server-2008
在我有这样一个表的场景中:
int id (PK)
int staff_id
int skill_id
bit mainskill
Run Code Online (Sandbox Code Playgroud)
我想为每个工作人员(由staff_id表示)仅选择一条记录,列出他们的主要技能,如(1)在mainskill中所示.如果没有主要技能,我想返回该工作人员的任何技能记录.例如:
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
Run Code Online (Sandbox Code Playgroud)
查询应该返回:
id staff_id skill_id mainskill
1 1 24 1
4 4 24 0
7 6 18 1
Run Code Online (Sandbox Code Playgroud)
我尝试了各种分组,DISTINCT等组合,但无法获得我之后的输出.任何帮助赞赏.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
两者都使用ROW_NUMBER,它仅在SQL Server 2005之后可用.
| 归档时间: |
|
| 查看次数: |
2744 次 |
| 最近记录: |