Как сгруппировать по 2 полям и упорядочить по дате одновременно? - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть 3 поля в таблице employees: personal_id, personal_id_type и date_registered.

Мне нужно найти все строки, по одной строке для каждого personal_id + personal_id_type (здесья думаю, что могу использовать группу GROUP), но поскольку для одного и того же personal_id + personal_id_type может быть много записей (поскольку сотрудники могут уйти и получить работу позже), мне нужно выбрать только самую новую запись (order by date_registered DESC).

Это концептуально правильно?Какой будет синтаксис для группировки по 2 полям?Достигну ли я того, что мне нужно?

Редактировать: Извините, на самом деле полей много, поэтому мне нужна самая новая строка, а не только самая новая дата.

Ответы [ 6 ]

3 голосов
/ 10 ноября 2011

Звучит так, как вы хотите:

select personal_id, personal_id_type, max(date_registered)
from employees 
group by personal_id, personal_id_type

Концептуально, вы не заказываете по дате, так как вы возвращаете только один на комбинацию personal_id / personal_id_type. Поскольку вы используете GROUP BY, вы используете агрегатную функцию для выбора МАКСИМАЛЬНОЙ даты.

2 голосов
/ 10 ноября 2011

Найдите самую новую дату для каждой комбинации (personal_id, personal_id_type) в подзапросе, затем присоединитесь к исходной таблице:

SELECT
    e.*
FROM
    employees e
  JOIN   
    ( SELECT
          personal_id
        , personal_id_type
        , MAX(date_registered) AS latest_date_registered
      FROM
          employees
      GROUP BY
          personal_id
        , personal_id_type
    ) AS grp
    ON  grp.personal_id = e.personal_id
    AND grp.personal_id_type = e.personal_id_type
    AND grp.latest_date_registered = e.date_registered
2 голосов
/ 10 ноября 2011
SELECT
    personal_id,
    personal_id_type,
    MAX(date_registered) AS latest_date_registered
FROM
    Employees E
GROUP BY
    personal_id,
    personal_id_type

Если вам нужны дополнительные столбцы, вам нужно добавить больше деталей к вашему вопросу.

0 голосов
/ 10 ноября 2011

Да, это правильно:

SELECT 
    personal_id, 
    personal_id_type, 
    MAX(date_registered) AS latest_date
FROM 
    employees 
GROUP BY 
    personal_id,
    personal_id_type
ORDER BY
    MAX(date_registered) DESC
0 голосов
/ 10 ноября 2011

Здесь агрегатные функции становятся полезными. Вы сгруппируете по personal_id и personal_id_type, затем используйте MAX(date_registered), чтобы выбрать самую новую дату. Просто помните, что вы должны группировать по всем неагрегированным столбцам.

0 голосов
/ 10 ноября 2011
SELECT personal_id, personal_id_type, MAX(date_registered)
FROM employees
GROUP BY personal_id, personal_id_type
ORDER BY MAX(date_registered) DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...