我有一张桌子:
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
以找出原因并得到了结果:
我在QUO_UQ
上有一个复合唯一索引mar_id, date
,似乎正在被使用。
从逻辑上讲,这似乎不是一个很难执行的查询,我该怎么做才能更有效地做到这一点?
答案 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
);