在一个场景,其中我有一个表,如下所示:

int id (PK)
int staff_id
int skill_id
bit mainskill

我想只选择一个用于每个工作人员(由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

查询应返回:

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

我试过分组,DISTINCT等的各种组合,但不能得到输出后我。任何帮助理解。

有帮助吗?

解决方案

SQL服务器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服务器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。

其他提示

如果您连接在skillid前面的mainskill,最大会给你任mainskill或一个其它地方mainskill不存在。

选择t.id,          t.staff_id,          t.skill_id,          t.mainskill, 从表T3 WHERE CAST(t.mainskill为varchar(5))+ ' - ' + CAST(t.skill_id为varchar(5)) 在 (SELECT MAX(CAST(t.mainskill为varchar(5))+ ' - ' + CAST(t.skill_id为varchar(5)))FROM 表T GROUP BY t.staff_id)

<强>的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

<强> - 伊恩

<强>的Oracle

怎么样:

(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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top