2011-08-31 35 views
4

我有一個表格,其中包含三個字段,每個產品都有多個記錄。我想知道如何獲得每個產品的前2名?我已經按時間字段排序了我的記錄。獲取每個產品的前兩個記錄

 
eventId productId time 
1  10568  2011-08-30 15:06:57 
2  10568  2011-08-30 15:06:56 
3  10568  2011-08-30 15:06:53 
4  10568  2011-08-30 15:06:50 

5  10111  2011-08-30 15:06:56 
6  10111  2011-08-30 15:06:53 
7  10111  2011-08-30 15:06:50 

8  10000  2011-08-30 15:06:56 
9  10000  2011-08-30 15:06:53 
10  10000  2011-08-30 15:06:50 

任何專家都可以幫助我獲得每個產品的前2名記錄嗎?

+3

按照「每個組最大的標籤」。這個問題在Stack Overflow上已經被回答了幾十次。 –

+0

[最大每個組+ MySQL](http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql?sort=votes&pagesize=50) –

回答

2
select * 
from table t 
inner join (select distinct productId as productId from table) table2 
    on (table2.productid = t.productid 
where table.time >= (select time from table innertable 
        where productid = t.productid 
        order by time desc 
        limit 1 offset 1) 
+0

我想限制2得到前2沒有偏移 – Martin

+1

查詢很好,但它只會排除只有一個事件的產品。通過在相同的子選擇上添加OR,可以解決這個問題,但限制爲1,沒有偏移量。我還修復了一個小錯字。 –

0

我沒有在手的SQL編輯器,但它可能會是這樣的:

SELECT * FROM theTable WHERE eventId IN 
    (SELECT TOP(2) eventId FROM theTable as innerTable 
     WHERE innerTable.productId = theTable.productId) 

替換「theTable」你的表名。

+0

TOP用於SQLSERVER,MYSQL使用LIMIT – Martin

+0

,你必須在Oracle中執行WHERE ROWNUM <= 2。這樣一個常用的功能,我很驚訝沒有一個單一的標準方式... –