【问题标题】:How do you select latest entry per column1 and per column2?您如何选择每列 1 和每列 2 的最新条目?
【发布时间】:2009-05-14 18:13:50
【问题描述】:

我对 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;

....

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

【问题讨论】:

  • 此表是否有主键(单个或组合)?

标签: sql mysql


【解决方案1】:

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

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)。

【讨论】:

    【解决方案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)包含一个候选键。 IE。一对给定的emp和cat只能有一个日期。

    【讨论】:

    • @R.Bremrose 的查询做出了同样的假设
    • 嗯,不,它没有。我为每个匹配 MAX(date) 的 emp 和 cat 返回任何行。
    • 对 - OP 希望每个 emp 和 cat 有 一个 行。您的解决方案和我的解决方案都可能会为每个 emp 和 cat 返回多行。
    • 所以如果有两行具有相同的(emp,cat,date),两个查询都返回多行的单个(emp,cat)只是说,不一定是错误的或任何东西:)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多