Уникальное соединение по условию MySQL - PullRequest
0 голосов
/ 17 марта 2020

У меня есть таблица, содержащая сотрудников, и в этой таблице у меня есть следующие данные:

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;

Но проблема здесь в том, что максимальный идентификатор не всегда означает, что активный пользователь (если он есть) всегда имеет максимальный идентификатор, как вы можете видеть в пользовательском SLEE.

Мне нужно написать условное объединение, если есть пользователь со статусом сотрудника 3, который возвращает максимальный идентификатор. Примерно такой запрос:

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

Ответы [ 4 ]

1 голос
/ 17 марта 2020

Вы можете использовать условное упорядочение с коррелированным подзапросом :

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
             );
0 голосов
/ 17 марта 2020

Я думаю, что это должно работать для вас

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

DBFiddle

0 голосов
/ 17 марта 2020

Если вы хотите 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;
0 голосов
/ 17 марта 2020

Если вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...