我有一张这样的桌子...
ID |
User_ID |
Skill |
Skill_Level |
Skill_ID |
1 |
1 |
Project Manager |
3 |
1 |
2 |
4 |
Teacher |
6 |
2 |
3 |
2 |
Teacher |
5 |
2 |
4 |
3 |
Administrator |
2 |
3 |
5 |
3 |
Project Manager |
3 |
1 |
6 |
1 |
Project Manager |
4 |
1 |
7 |
4 |
Deputy Head |
5 |
4 |
8 |
2 |
Teacher |
6 |
2 |
出于监管原因,我们无法删除旧(历史)行。我需要运行一个查询,仅返回“User_ID”+“技能”和“最佳技能级别”(即每人的最大值)的集合。成功的查询应该如下所示...因此,有些人可以拥有不止一项技能(本例中为 User_ID 3 和 4),而有些人的技能会变得更加熟练(User_ID 1 和 2)。
ID |
User_ID |
Skill |
Skill_Level |
Skill_ID |
2 |
4 |
Teacher |
6 |
2 |
4 |
3 |
Administrator |
2 |
3 |
5 |
3 |
Project Manager |
3 |
1 |
6 |
1 |
Project Manager |
4 |
1 |
7 |
4 |
Deputy Head |
5 |
4 |
8 |
2 |
Teacher |
6 |
2 |
您是否有关于可以实现此目的的最有效和最短的查询代码的建议?有一个带有 PK Skill_ID_PK 的表 [dbo].[skills],一个带有 PK user_ID_PK 的表 [dbo].[people],以及一个带有 FK Skill_ID_PK 和 FK user_ID_PK 的表 [dbo].[skillHistory]。
非常欢迎任何帮助。
Using a 对于雪花我发现使用QUALIFY
是建议,但我认为这在 MSSQL 中不起作用。
要做到这一点,无需QUALIFY
,你可以尝试这样的事情:
MSSQL
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY User_ID, Skill ORDER BY Skill_Level DESC) AS RN
FROM table
) AS T
WHERE T.RN = 1;
对于支持的 RDBMSQUALIFY
,
SELECT
*
FROM
table QUALIFY ROW_NUMBER() OVER (
PARTITION BY User_ID, Skill
ORDER BY Skill_Level DESC
) = 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)