2012-07-19 3 views
0

이 내 표 그래서두 개의 열이

BID   PID      TIME 
---------+-------------------+---------------------- 
1345653  330760137950  2012-07-09 21:42:29 
1345653  330760137950  2012-07-09 21:43:29 
1345653  330760137950  2012-07-09 21:40:29 
1345653  330760137950  2012-07-09 21:41:29 
1345653  110909316904  2012-07-09 21:29:06 
1345653  221065796761  2012-07-09 19:31:48 

에서 아래 데이터입니다 일치 3의 TOP 찾기 이 PID는 330760137950four times이지만 타임 스탬프는 다릅니다.

1345653  330760137950  2012-07-09 21:43:29 
1345653  330760137950  2012-07-09 21:42:29 
1345653  330760137950  2012-07-09 21:41:29 
1345653  110909316904  2012-07-09 21:29:06 
1345653  221065796761  2012-07-09 19:31:48 

그래서 기본적으로 만약 BIDPID은 동일하지만 서로 다른 timestamps로, 나는이 시간에 함께 분류 사람들의 TOP 3 필요 -이 : 그래서 내가 필요 this-

출력과 같은 출력 뭔가가 필요 내림차순

그리고 이것을 위해 하이브에 rank UDF (User Defined Function)을 만들었습니다. 그리고 나는 아래 쿼리를 썼다. 아무도 이것에 나를 도울 수 있습니까?

SELECT bid, pid, rank(bid), time, UNIX_TIMESTAMP(time) 
FROM (
    SELECT bid, pid, time 
    FROM table1 
    where to_date(from_unixtime(cast(UNIX_TIMESTAMP(time) as int))) = '2012-07-09' 
    DISTRIBUTE BY bid,pid 
    SORT BY bid, time desc 
) a 
WHERE rank(bid) < 3; 

그래서 위의 질의와 나는 위의 Expected Output의 마지막 두 행을 잃었으로 잘못이

1345653  330760137950  2012-07-09 21:43:29 
1345653  330760137950  2012-07-09 21:42:29 
1345653  330760137950  2012-07-09 21:41:29 

같은 출력을 얻고있다. 아무도 이것으로 나를 도울 수 있습니까?

답변

1
select bid, pid, [time] from (
    select bid, pid, [time], rank() over (partition by bid, pid order by [time] desc) as k 
    from #temp) as x 
where k <=3 
order by bid, pid, time desc 

오, 전 SQL Server에 있습니다. 나는 너를 생각하지 않는다 ........

어쨌든. 내 추천은 네가 선택한 중첩 된 선택 내에서 순위 함수를 이동한다는 것입니다. 바깥 쪽에서 3보다 적은 곳에서 그것을 원한다고 선택하십시오 ... 당신의 구문을 모르겠습니다. 나는이 질문에 대답해서는 안된다. 죄송합니다 .... 롤

여기에 : http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/ 귀하의 순위()는 내부에 있어야합니다 ... 내부에 있어야합니다. < 4 또는 < = 3 또는 무엇이든 외부의 where 문으로 두십시오. 당신의 질의는 그 예제와 거의 똑같아 보인다. 단지 약간의 변경이 필요하다. 링크 및 하이브의 지식 내 절대 LACK에 따라

는 ... 난 당신이 할 수 있습니다 생각 :

SELECT bid, pid, time 
FROM (
    SELECT bid, pid, rank(time) as rank, time 
    FROM $compTable 
    DISTRIBUTE BY bid, pid 
    SORT BY bid, pid, time desc 
) a 
WHERE rank < 4 
ORDER BY bid, pid, time desc 

을하고 난 테스트하거나 정직하게 내가 어떤 실마리가 없기 때문에 컴파일 할 수있는 하이브는 당신이 질문을 올리기 전에 나타났습니다. (작은 세계, 나도 알아, 너무 슬픈 - 사실)

+0

그래. 나는 하이브에서 일하고있다. 나는 (K testingtable1에서 \t \t로 \t \t 선택 buyer_id, ITEM_ID, created_time, 순위() (buyer_id에 의해 파티션, created_time 내림차순으로 순서를 ITEM_ID 이상))에서,'buyer_id 선택 당신을 수정하여 created_time를이 쿼리를 ITEM_ID 사용하고 으로 x \t 여기서 k <= 3 \t 주문 buyer_id, item_id, created_time desc;에 의해 주문 및 'FAILED : 구문 오류 : 줄 2시 52 분 일치하지 않는 입력'('FROM에서 from 절 기대'. 제안 이유는 무엇입니까? – ferhan

+0

아니 .... 난 몰라. 귀하의 코드는 SQL 서버에서 실행됩니다. 그것은 "테이블"에서 중첩 선택을 좋아하지 않을 수도 있습니다 ..... 당신은 중첩 된 선택을해야 할 수도 있습니다 임시 테이블을 선택한 다음 #temp에서 *를 선택하십시오. 여기서 k <= 3 또는 뭔가 ...? –

+0

또는 하이브에 rank()가 없습니다 ... 죄송합니다! –