根据日期在MySQL中获取最新行(按另一列分组)
问题描述:
此类问题每隔一段时间问一次。提供的查询有效,但会影响性能。根据日期在MySQL中获取最新行(按另一列分组)
我已经试过JOIN
方法:
SELECT *
FROM nbk_tabl
INNER JOIN (
SELECT ITEM_NO, MAX(REF_DATE) as LDATE
FROM nbk_tabl
GROUP BY ITEM_NO) nbk2
ON nbk_tabl.REF_DATE = nbk2.LDATE
AND nbk_tabl.ITEM_NO = nbk2.ITEM_NO
而且一个元组(方法要慢):
SELECT *
FROM nbk_tabl
WHERE REF_DATE IN (
SELECT MAX(REF_DATE)
FROM nbk_tabl
GROUP BY ITEM_NO
)
是否有这样做的任何其他性能友好的方式?
编辑:为了清楚起见,我将它应用到一个有数千行的表格中。
答
是的,有一个更快的方法。
select *
from nbk_table
order by ref_date desc
limit <n>
您希望返回的行数是多少。
等一等。我看到你正在尝试为特定项目做到这一点。你可以试试这个:
select *
from nbk_table n
where ref_date = (select max(ref_date) from nbk_table n2 where n.item_no = n2.item_no)
这可能会优化比“中”更好的版本。
答
此外,在MySQL中,你可以使用用户变量(假设nbk_tabl.Item_no <> 0):
select *
from (
select nbk_tabl.*,
@i := if(@ITEM_NO = ITEM_NO, @i + 1, 1) as row_num,
@ITEM_NO := ITEM_NO as t_itemNo
from nbk_tabl,(select @i := 0, @ITEM_NO := 0) t
order by Item_no, REF_DATE DESC
) as x where x.row_num = 1;
它会返回一个同样的'ITEM_NO'多行。这是我首先要避免的。 – Ruel 2012-08-16 01:41:39
@Ruel。 。 。我发现你的问题含糊不清。标题暗示了一件事,但另一个查询示例。我终于明白了这一点。 – 2012-08-16 01:46:18
对不起。修正了我的标题。 – Ruel 2012-08-16 01:48:29