簡體   English   中英

從MYSQL中的每個組中獲取頭條記錄

[英]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

DEMO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM