我想优化查询,但是我不知道该怎么做。这是我要查询的表:
Device table:
Id || PushId || created
abc aaa 10/10/13
def aaa 10/12/13
efg abb 9/9/12
我想要的查询如下:我想要获取重复的PushIds并从表中删除两者中最旧的条目。这是我到目前为止的内容(选择而不是删除,因为我仍处于测试阶段)
select m.* from
(select pushId, created
from Device
group by pushId
having count(*) >1)
as m inner join Device mm on mm.pushId = m.pushId and mm.created = m.created;
这将正确返回应删除的内容,但是它非常非常慢。有更快的方法吗?没有临时表,有没有办法做到这一点?即一次扫描?
编辑:这是MySQL,我错误地在其中放置了MS-SQL标记。道歉的家伙
最佳答案
这将使用@变量提供与MySQL中的row_number()等效的功能。在这里,它会找到每个PushId的所有内容,除了最近的2行
SELECT
PushId
, Id
, created
FROM (
SELECT
@row_num :=IF(@prev_value = d.PushId,@row_num+1,1)AS RN
, d.PushId
, d.Id
, d.created
, @prev_value := d.PushId
FROM tblDevices d
CROSS JOIN(SELECT @row_num :=1, @prev_value :='') vars
ORDER BY
d.PushId
, d.created DESC
) SQ
WHERE RN > 2
;
您可以通过更改顺序(例如更改为ASC)来查找最旧的记录,从而更改结果。请注意,交叉联接仅用于将2 @ vars“附加”到每一行,并且由于只有一行,因此对实际记录数没有影响。然后在查询中设置变量。
关于mysql - 优化查询,重复具有最旧日期的行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24506375/