我有一个表 event_log ,其中包含MYSQL中的以下列,
CREATE TABLE IF NOT EXISTS `event_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`customer_id` varchar(50) DEFAULT NULL,
`event_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
示例数据可以是,
id, customer_id, event_time
1 100 '2015-03-22 23:54:37'
2 100 '2015-03-21 23:54:37'
3 100 '2015-03-20 23:54:37'
4 101 '2015-03-19 23:54:37'
5 102 '2015-03-19 23:54:37'
6 102 '2015-03-18 23:54:37'
7 103 '2015-03-17 23:54:37'
8 103 '2015-03-16 23:54:37'
9 103 '2015-03-15 23:54:37'
10 103 '2015-03-14 23:54:37'
我想对customer_id进行分组,然后使用event_time列(时间更长)从每个组中选择前2条记录
请建议
谢谢, 费萨尔纳西尔
答案 0 :(得分:2)
这是一个不使用变量的版本:
select el.*
from event_log el
where 2 >= (select count(*)
from event_log el2
where el2.customer_id = el.customer_id and
el2.event_time >= el.event_time
);
这甚至可以在event_log(customer_id, event_time)
的索引上具有合理的性能。
答案 1 :(得分:0)
使用用户定义的变量为每个customer_id选择2个最近的条目的一种方法
SELECT `id`, `customer_id`, `event_time`,row_num
FROM (
SELECT *,
@r:= CASE WHEN @g = `customer_id` THEN @r +1 ELSE 1 END row_num,
@g:= `customer_id`
FROM event_log
CROSS JOIN(SELECT @g:= NULL,@r:=0) a
ORDER BY `customer_id`,`event_time` desc
) t
where row_num <= 2