有效地选择按列分组的最新行

时间:2019-03-16 09:37:54

标签: mysql sql

我有一张桌子:

QUOTE
| id | value | mar_id | date |

我正在尝试为每个mar_id(市场ID)选择最新的行。我已经设法从下面的查询中实现我所需要的:

SELECT 
q.*
FROM quote q
WHERE q.date = (
  SELECT MAX(q1.date)
  FROM quote q1
  WHERE q.mar_id = q1.mar_id
)

但是我发现查询的速度非常慢(> 60s),以至于我的数据库终止了连接。

我做了EXPLAIN以找出原因并得到了结果:

Explain Plan

我在QUO_UQ上有一个复合唯一索引mar_id, date,似乎正在被使用。

从逻辑上讲,这似乎不是一个很难执行的查询,我该怎么做才能更有效地做到这一点?

3 个答案:

答案 0 :(得分:1)

不相关子查询的示例

SELECT x.*
  FROM quote x
  JOIN 
     ( SELECT mar_id
            , MAX(date) date
         FROM quote
        GROUP 
           BY mar_id
     ) y
    ON y.mar_id = x.mar_id
   AND y.date = x.date;

答案 1 :(得分:0)

select * from (
select mar_id, [date],row_number() over (partition by mar_id order by [date] desc ) as [Rank] from
qoute
group by mar_id, [date]) q where Rank = 1

答案 2 :(得分:0)

您的查询很好:

SELECT q.*
FROM quote q
WHERE q.date = (SELECT MAX(q1.date)
                FROM quote q1
                WHERE q.mar_id = q1.mar_id
               );

我建议在quote(mar_id, date)上建立索引。这可能是获得结果的最快方法。

编辑:

我很好奇,如果您发现它使用了索引:

SELECT q.*
FROM quote q
WHERE q.date = (SELECT q1.date
                FROM quote q1
                WHERE q.mar_id = q1.mar_id
                ORDER BY q1.date DESC
                LIMIT 1
               );