mysql获取最大日期的金额值
我有一张这样的桌子:mysql获取最大日期的金额值,mysql,Mysql,我有一张这样的桌子: mydate kodetb amount ----------------------------- 2016-03-10 203 600 2016-03-11 203 100 2016-03-11 200 110 kodetb mydate amount service -------------------------------------- 200 2016-03-11 110
mydate kodetb amount
-----------------------------
2016-03-10 203 600
2016-03-11 203 100
2016-03-11 200 110
kodetb mydate amount service
--------------------------------------
200 2016-03-11 110 ok
203 2016-03-10 100 not ok
我有像这样的B桌
kodetb service
---------------
200 ok
203 not ok
我想这样显示结果:
mydate kodetb amount
-----------------------------
2016-03-10 203 600
2016-03-11 203 100
2016-03-11 200 110
kodetb mydate amount service
--------------------------------------
200 2016-03-11 110 ok
203 2016-03-10 100 not ok
其中显示第二行结果100,因为它具有最新/最大日期
请帮助下面的查询工作正常。我已经在我的本地计算机上进行了测试,它提供了所需的输出
SELECT tableA.kodetb,mydate,amount,service
FROM tableA, tableB
WHERE tableA.kodetb = tableB.kodetb
GROUP BY tableA.kodetb
HAVING MAX(mydate);
在不需要条件的表数据中。但是,当表中还存在不匹配的数据时,匹配数据需要它。这应该可以做到:
select tablea.kodetb, mydate, amount, tableb.service
from tablea
inner join tableb on tablea.kodetb = tableb.kodetb
order by mydate desc
您可以使用连接和不存在
查询
select t1.kodetb, t1.mydate, t1.amount, t2.service
from tableA t1
join tableB t2
on t1.kodetb = t2.kodetb
where not exists(
select 1 from tableA t
where t.kodetb = t1.kodetb
and t.mydate > t1.mydate
)
order by t1.kodetb;
您可以通过相关子查询来实现这一点,但这些子查询效率非常低 这种方法适用于联接,您必须使用表别名来标识没有更大值的记录(这就是
左侧外部的作用)。如果c.mydate的值最大,则此技巧将为您提供一个NULL
:
SELECT a.kodetb, a.mydate, a.amount, b.service
FROM tableA a INNER JOIN tableB b ON a.kodetb = b.kodetb
LEFT OUTER JOIN tableA c ON c.kodetb = a.kodetb AND c.mydate > a.mydate
WHERE c.mydate IS NULL
下面是一把小提琴,显示了结果:
这是一个棘手的查询,因为当您使用诸如MAX
(或SUM
或AVG
或其他任何内容)之类的“聚合”时,您必须按所选列中的所有其他列进行分组。因此,如果从表中选择MAX(xdate)、name、service,您会得到一个错误,因为xdate
是一个“聚合”,并且您没有按列name
和service分组,这是不正确的,它显示了3个结果,应该只显示了2个不正确的结果,它不显示最新的交易日期。它显示的是最新的交易日期。我已经在我的本地机器上进行了测试,您可以说明它不显示最新日期的原因吗?您必须让您的选择语句中聚合函数中未使用的所有列,以便按照您在结果中建议的方式执行此操作,对于kodetb=203
date应该是2016-03-11
right??这是可行的,但相关子查询的效率不如联接。我更喜欢这种东西。