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

标签 sql sql-server tsql sql-server-2008 ranking

在我有一个像这样的表的情况下:

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

最佳答案

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 起可用。

关于SQL - 选择一个字段中具有来自另一字段的最高记录的不同记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2130131/

相关文章:

sql - MySql 需要很长时间来优化无连接查询

c# - 使 Entity Framework 重用一个值

java - 如何使用 JdbcTemplate 获取数组形式的结果?

sql - SQL Server 中的滑动窗口函数,高级计算

sql-server - 用于将 SQL Server 中的表字段从 NULL 更新为非 NULL 的更新脚本

database - SQL Server 2005 - T-SQL - 如何生成 int ID?

mysql - 在 SQL 中使用 Join 删除操作

sql-server - 合并语句错误调试

SQL Server 动态排序依据

sql - 检查用户是否具有 CREATE DATABASE 权限