mariadb 按优先级为每个具有status_id的员工选择单行

ftf50wuq  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(113)

我只需要从employee_leaves表中为每个雇员提取一条记录(employee_id),但前提是status_id等于以下数字之一:7, 4, 3(按优先级写入)。当未找到status_id=7的行时,应查找status_id=4的行。当未找到时,应查找status_id=3的行。
示例:应返回id=4的行
| 身份证|雇员标识|状态标识|
| --------------|--------------|--------------|
| 1|七|1|
| 二|七|二|
| 三|七|四|
| 四|七|七|
| 九|七|三|
| 二十七|七|七|

iyfjxgzm

iyfjxgzm1#

首先过滤每个employee_id的行,以获得所需的status_id
然后,通过应用所需的优先级,使用ROW_NUMBER()窗口函数对行进行排名。
最后从每个排名中选择第一行:

WITH cte AS (
  SELECT *,
         ROW_NUMBER() OVER (
           PARTITION BY employee_id
           ORDER BY status_id = 7 DESC,
                    status_id = 4 DESC,
                    status_id = 3 DESC, -- this is the last option and it is actually not needed
                    id
         ) AS rn 
  FROM employee_leaves 
  WHERE status_id IN (7, 4, 3)
)
SELECT id, employee_id, status_id 
FROM cte 
WHERE rn = 1;

ROW_NUMBER()中的ORDER BY子句可以通过使用函数FIELD()来简化:

ORDER BY FIELD(status_id, 7, 4, 3),
         id

或者函数FIND_IN_SET()

ORDER BY FIND_IN_SET(status_id, '7,4,3'),
         id

请参见demo

相关问题