SQL - 选择不重复的记录在一个字段与另一场最高纪录
-
22-09-2019 - |
题
在一个场景,其中我有一个表,如下所示:
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);
不隶属于 StackOverflow