如何按2个字段分组并同时按日期排序?

时间:2011-11-10 15:59:11

标签: mysql sql greatest-n-per-group

我在employees表中有3个字段:personal_idpersonal_id_typedate_registered

我需要找到所有行,每行personal_id + personal_id_type一行(这里是我认为可以使用GROUP的地方),但因为同一personal_id + personal_id_type可能有很多条目(因为员工可以退出并稍后再次雇用),我只需要获取最新的条目(order by date_registered DESC)。

这在概念上是否正确?按2个字段分组的语法是什么?我能实现我的需要吗?

编辑:对不起,实际上有很多字段,所以我需要最新的一行,而不仅仅是最新的日期。

6 个答案:

答案 0 :(得分:3)

听起来你想要的是:

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,因此使用聚合函数来选择MAX日期。

答案 1 :(得分:2)

SELECT
    personal_id,
    personal_id_type,
    MAX(date_registered) AS latest_date_registered
FROM
    Employees E
GROUP BY
    personal_id,
    personal_id_type

如果您需要其他列,则需要在问题中添加更多详细信息。

答案 2 :(得分:2)

在子查询中查找每个(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

答案 3 :(得分:0)

SELECT personal_id, personal_id_type, MAX(date_registered)
FROM employees
GROUP BY personal_id, personal_id_type
ORDER BY MAX(date_registered) DESC

答案 4 :(得分:0)

这是聚合函数变得有用的地方。您将按personal_idpersonal_id_type分组,然后使用MAX(date_registered)选择最新日期。请记住,您必须按所有非聚合列进行分组。

答案 5 :(得分:0)

是的,这是正确的:

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