4

在我有这样一张桌子的情况下:

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 等组合,但无法获得我想要的输出。任何帮助表示赞赏。

4

4 回答 4

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

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,它仅在 SQL Server 2005 之后才可用。

于 2010-01-25T04:09:26.377 回答
1

如果您将主技能连接到技能ID 的前面,max 将为您提供主技能或不存在主技能的其他技能。

SELECT t.id, t.staff_id, t.skill_id, t.mainskill, FROM TABLE t WHERE CAST(t.mainskill As Varchar(5))+'-'+ Cast(t.skill_id as varchar(5)) IN ( SELECT MAX(CAST(t.mainskill As Varchar(5))+'-'+ Cast(t.skill_id as varchar(5))) 从表 t GROUP BY t.staff_id)

于 2010-01-25T15:30:58.130 回答
0

MySQL

select * from staff_skill;

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          

7 rows selected


select * from staff_skill x
where skill_id =
(select y.skill_id from staff_skill y
where y.staff_id = x.staff_id 
order by y.mainskill desc, y.skill_id desc limit 1);

id         staff_id   skill_id   mainskill  
---------- ---------- ---------- ---------- 
1          1          24         1          
4          4          24         0          
7          6          18         1          

3 rows selected

- 伊恩

于 2010-01-25T11:09:27.763 回答
0

甲骨文

怎么样:

(staff_skill 是你的桌子)

select * from staff_skill x where
skill_id =
(select skill_id from 
(select * from staff_skill 
order by mainskill desc, skill_id desc)
where staff_id = x.staff_id and rownum = 1);
于 2010-01-26T13:07:32.907 回答