如何选择每列1和每列2的最新条目?

时间:2009-05-14 18:13:50

标签: sql mysql

我对mysql很新,需要一个我无法弄清楚的查询。给出一个像这样的表:

emp  cat  date        amt   cum
44   e1   2009-01-01  1     1
44   e2   2009-01-02  2     2
44   e1   2009-01-03  3     4
44   e1   2009-01-07  5     9
44   e7   2009-01-04  5     5
44   e2   2009-01-04  3     5
44   e7   2009-01-05  1     6
55   e7   2009-01-02  2     2
55   e1   2009-01-05  4     4
55   e7   2009-01-03  4     6

我需要根据'emp'和每'cat'选择最新的日期交易。上表会产生类似的内容:

emp  cat  date        amt   cum
44   e1   2009-01-07  5     9
44   e2   2009-01-04  3     5
44   e7   2009-01-05  1     6
55   e1   2009-01-05  4     4
55   e7   2009-01-03  4     6 

我尝试过类似的事情:

select * from orders where emp=44 and category='e1' order by date desc limit 1;
select * from orders where emp=44 and category='e2' order by date desc limit 1;

...

但这感觉不对。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:5)

应该有效,但我还没有测试过。

SELECT orders.* FROM orders
INNER JOIN (
  SELECT emp, cat, MAX(date) date
    FROM orders
    GROUP BY emp, cat
  ) criteria USING (emp, cat, date)

基本上,这使用子查询来获取每个emp和cat的最新条目,然后将其与原始表连接以获取该订单的所有数据(因为您不能GROUP BY amt和cum)。

答案 1 :(得分:2)

@ R.Bemrose给出的答案应该有效,这是另一个比较技巧:

SELECT o1.*
FROM orders o1
LEFT OUTER JOIN orders o2
 ON (o1.emp = o2.emp AND o1.cat = o2.cat AND o1.date < o2.date)
WHERE o2.emp IS NULL;

这假设列(emp,cat,date)包含候选键。即对于给定的一对emp&amp;只能有一个日期猫。