[英]Unique join by condition on MySQL
我有一个包含员工的表,在这个表中我有以下数据:
id username employee_status
33189 SLEE 3
36351 SLEE 0
29096595 SLEE 0
19197668 AARM 0
20738021 AARM 0
29097305 AARM 0
员工状态 3 表示活跃,0 表示非活跃。 所以这个数据意味着用户 SLEE 已经被转移了几次并且仍然在公司工作,而用户 AARM 已经被转移了几次并离开了公司。
我需要的是在这张桌子上进行不同的联接。 我可以写一个这样的查询:
SELECT username
, MAX(id)
FROM employees
GROUP BY username;
但这里的问题是拥有最大 id 并不总是意味着活动用户(如果有的话)总是拥有最大 id,正如您在用户 SLEE 中看到的那样。
我需要编写一个条件连接,如果有一个员工状态为 3 的用户返回,否则返回最大 id。 像这样的查询:
SELECT userid
, IF(employeestatus = 3 THEN id ELSE MAX(id) END)
FROM employees
GROUP BY userid;
但是这个查询不起作用。 预期结果是:
id username employee_status
33189 SLEE 3
29097305 AARM 0
您可以将条件排序与相关子查询一起使用:
select e.*
from de_ie_cm.employees e
where e.id = (select e1.id
from de_ie_cm.employees e1
where e1.userid = e.userid
order by (case when employeestatus = 3 then 0 else 1 end), id desc
limit 1
);
如果您使用的是 MySQL 8.0+ 版,那么此代码将适用于您。
SELECT ID,username,Employee_Status FROM
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY username ORDER BY Final_ID DESC) Rw_ID FROM
(
SELECT ID,username,employee_Status,CASE WHEN Employee_Status = 3 THEN 2 ELSE 0 END + CASE WHEN R_ID = 1 THEN 1 ELSE 0 END AS Final_ID
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY username ORDER BY CAST(Id AS INT) DESC) AS R_ID ,*
FROM employees
)A
)A
) B WHERE Rw_ID = 1
如果你想在id
,其中状态为3
和最大id
,否则,那么你可以使用条件汇总:
SELECT userid, MAX(employeestatus) as employee_status,
COALESCE(MAX(CASE WHEN employeestatus = 3 THEN id END),
MAX(id)
)
FROM employees
GROUP BY userid;
我认为这应该适合你
SELECT (CASE
WHEN max(status) = 0 THEN max(id)
WHEN max(status) = 3 THEN
(SELECT id
FROM A a2
WHERE status = 3
AND a1.name = a2.name)
END) AS aggregate_id,
name
FROM A a1
GROUP BY name
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.