模拟row_number()MySQL

时间:2014-11-14 13:21:19

标签: mysql sql window-functions

你能帮我解决一下MySql中的row_number() over partition吗?

我已经尝试过下面的脚本但它无法正常工作。我试图只选择购买的第一个产品。我选择的列是Client_id,product和purchase_date。

select * from(select * from (SELECT @rownum:=@rownum + 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

谢谢, 罗迪卡

1 个答案:

答案 0 :(得分: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中表达式的评估顺序。