2011-11-10 58 views
0

我在employees表中有3个字段:personal_id,personal_id_typedate_registered如何按2个字段进行分组并同时按日期排序?

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

这在概念上是正确的吗?按2个字段分组的语法是什么?我会用我的方法达到我需要的吗?

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

+2

你明确地说:“我有3个领域在雇员表中:personal_id,personal_id_type和date_registered“ - 不确定您是如何预期针对不同模式定制的答案的。 – RedFilter

+0

我说“我有3个领域”,而不是“我只有3个领域”。所以它可以被解读为“我有[至少] 3个领域”。无论如何,模式在现实世界中发生了变化,所以我一直在寻找一个通用的解决方案(这就是为什么我说最新的入口,而不是最新的日期) – HappyDeveloper

+0

另一件事:你的问题是'[最大每组]类型。查看** Related **标题下的相似问题。 –

回答

1

查找子查询每(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 
+0

这似乎是我正在寻找的答案。我将测试查询 – HappyDeveloper

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日期。

+0

我很抱歉,但实际上有很多字段,所以我需要最新的一行,而不仅仅是最新的日期。 – HappyDeveloper

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

如果您需要更多列,那么您需要为您的问题添加更多详细信息。

+0

我很抱歉,但实际上有很多字段,所以我需要最新的一行,而不仅仅是最新的日期。 – HappyDeveloper

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 
+0

这没有解决他的分组/聚合问题。 –

+0

不是吗?它将所有非聚合字段分组,然后按最近的日期注册顺序向下排列记录。 – vice

+0

他不希望订购,他只想要最新的'date_registered'。 'order by'会将最新的行推到最前面,但所有其他行仍然包含在查询中,因此'MAX'聚合函数......我看到他编辑了他的问题,所以不用介意。 –

0

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

+0

我很抱歉,但实际上有很多字段,所以我需要最新的一行,而不仅仅是最新的日期。 – HappyDeveloper

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 
相关问题