2011-08-31 2 views
4

아래의 세 필드가있는 테이블이 있습니다. 각 제품에는 여러 레코드가 있습니다. 각 제품별로 2 위를 가져올 수있는 방법이 궁금합니다. 나는 시간 기록으로 나의 기록을 이미 분류했다.각 제품에 대해 상위 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

'가장 큰 n-per-group' 태그를 따르십시오. 이 질문은 Stack Overflow에서 수십 번 대답되었습니다. –

+0

[최대 -n-per-group + mysql] –

답변

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를 얻는다 고 생각합니다. (http://stackoverflow.com/questions/tagged/greatest-n-per-group+mysql?sort=votes&pagesize=50) 옵셋이없는 그룹 – Martin

+1

좋은 쿼리이지만 이벤트가 하나 뿐인 제품은 제외됩니다. 동일한 하위 선택으로 OR을 추가하지만 한도가없는 경우 오프셋없이 해결할 수 있습니다. 그리고 작은 오타도 수정했습니다. –

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를 수행해야합니다. 이러한 공통적으로 사용되는 기능은 단일 표준 방법이 하나도 없다는 것에 놀랐습니다 ... –

관련 문제