rsw*_*lff 3 mysql sql greatest-n-per-group
使用MYSQL我想重构以下SELECT
语句以返回包含最新内容invoice_date
的整个记录:
> SELECT id, invoice, invoice_date
FROM invoice_items
WHERE lot = 1047
id invoice_id invoice_date
-----------------------------------
3235 1047 2009-12-15 11:40:00
3295 1047 2009-12-15 16:00:00
3311 1047 2009-12-15 09:30:00
3340 1047 2009-12-15 13:50:00
Run Code Online (Sandbox Code Playgroud)
使用MAX()聚合函数和GROUP BY子句让我成为那里的一部分:
> SELECT id, invoice_id, max(invoice_date)
FROM invoice_items
WHERE invoice_id = 1047
GROUP BY invoice_id
id invoice_id invoice_date
-----------------------------------
3235 1047 2009-12-15 16:00:00
Run Code Online (Sandbox Code Playgroud)
请注意,查询似乎MAX(invoice_date)
正确,但id
返回的(3235)不是id
包含MAX(invoice_date)
(3295)的记录,它是id
初始查询中第一条记录的记录.
如何重构此查询以向我提供包含?的整个记录MAX(invoice_date)
?
解决方案必须使用GROUP BY子句,因为我需要invoice_date
为每个发票获取最新信息.
这是经常重复的"每组最大n"问题.
以下是我在MySQL中解决它的方法:
SELECT i1.*
FROM invoice_items i1
LEFT OUTER JOIN invoice_items i2
ON (i1.invoice_id = i2.invoice_id AND i1.invoice_date < i2.invoice_date)
WHERE i2.invoice_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
说明:对于每一行i1
,尝试查找i2
具有相同invoice_id
和更大日期的行.如果没有找到(即i2
由于外连接而全部为空),则i1
必须是具有最大日期的行invoice_id
.
这种使用连接的解决方案往往更适合MySQL,这在优化两个GROUP BY
和子查询时都很弱.
归档时间: |
|
查看次数: |
2321 次 |
最近记录: |