SQL - 在一个字段中选择具有来自另一个字段的最高记录的不同记录

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等组合,但无法获得我之后的输出.任何帮助赞赏.

OMG*_*ies 7

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

两者都使用ROW_NUMBER,它仅在SQL Server 2005之后可用.