2014-11-14 2 views
1

Можете ли вы мне помочь с row_number() over partition в MySql?Имитация row_number() 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 из предыдущего ряда, и использовать эту информацию:

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; 

Вы должны сделать назначение @rn и @c в том же заявлении, поскольку MySQL не гарантирует порядок оценки выражений в select.

+0

Спасибо, Гордон! Я получаю сообщение об ошибке: # 1064 - неверная версия сервера MySql для использования рядом с if (@c: = @cliend_id, 1, 1))) as rownum – RodiX

+0

Произошла пропавшая запятая. Это странная ошибка, но она может это исправить. –

+0

Я больше не получаю сообщение об ошибке, но возвращенный rownum равен 1 для всех значений .. он не увеличивает – RodiX

Смежные вопросы