从MYSQL中的每个组中获取最佳记录

时间:2015-03-23 16:13:06

标签: mysql sql

我有一个表 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条记录

请建议

谢谢, 费萨尔纳西尔

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

DEMO