2014-11-14 8 views
1

MySql에서 row_number() over partition을 도와 드릴까요?행 번호 시뮬레이션() MySQL

아래 스크립트를 시도했지만 제대로 작동하지 않습니다. 나는 처음으로 구입 한 제품만을 선택하려고합니다. 내가 선택한 열은 Client_id, product 및 purchase_date입니다.

select * from(select * from (SELECT @rownum:[email protected] + 1 as row_number,t.* 
FROM (select cliend_id,prod,purchase_date from Mytable  
group by cliend_id,prod,purchase_date order by cliend_id,purchase_Date) asc) t, 
(SELECT @rownum := 0) r)a)b; 

결과 :

Row_number Client ID Prod Purchase date 
1    1111 apple 11-Nov-10 
2    1111 yougurt 11-Nov-11 
3    1111 candy 11-Nov-13 
4    2222 chocolate 11-Nov-09 
5    2222 pear 9-Sep-09 
6    2222 beer 12-Sep-10 
7    2222 cheese 12-Sep-14 
8    1234 apple 15-Nov-12 
9    1234 candy 4-Oct-14 

어떻게이 결과를 얻을 수 있나요?

Row_number Client ID Prod Purchase date 
1    1111 apple 11-Nov-10 
2    1111 yougurt 11-Nov-11 
3    1111 candy 11-Nov-13 
1    2222 chocolate 11-Nov-09 
2    2222 pear 9-Sep-09 
3    2222 beer 12-Sep-10 
4    2222 cheese 12-Sep-14 
1    1234 apple 15-Nov-12 
2    1234 candy 4-Oct-14 

감사합니다, 로디 카

+0

초콜릿이 1에서 행 번호를 시작하지 않아야합니까? –

답변

1

당신은 이전 행에서 cliend_id의 값을 "기억"하고, 그 정보를 사용할 수 있습니다 : 당신은 @rn의 할당을해야

select (@rn := if(@c = cliend_id, @rn + 1, 
        if(@c := @liend_id, 1, 1) 
       ) 
     ) as rownum, 
     cliend_id, prod, purchase_date 
from (select cliend_id, prod, purchase_date 
     from Mytable  
     group by cliend_id, prod, purchase_date 
    ) t cross join 
    (select @rn := 0, @c := 0) vars 
order by cliend_id, purchase_Date; 

@c 같은 문장에서, MySQL은 select에있는 표현식의 평가 순서를 보장하지 않기 때문에.

+0

고든 고마워! if 문과 관련하여 오류가 발생합니다. # 1064 - 근처에 사용할 올바른 MySql 서버 버전이 아닙니다 (@c : = @cliend_id, 1, 1))) rownum으로 – RodiX

+0

누락 된 쉼표가있었습니다. 그것은 이상한 오류이지만 해결할 수도 있습니다. –

+0

더 이상 오류가 표시되지 않지만 반환 된 rownum은 모든 값에 대해 1입니다. 증가하지 않습니다. – RodiX