[英]Get the Top records from each group in MYSQL
我有一個表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條記錄
請提出建議
謝謝,Faisal Nasir
這是不使用變量的版本:
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)
上的索引,甚至可以具有合理的性能。
一種使用用戶定義的變量來為每個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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.