0

假设我有这张桌子:

| Order ID |  User  |  Order Date |  
-----------------------------------  
|    1     | Dave   |  03/01/2017 |   
|    2     | Jim    |  03/09/2017 |  
|    3     | John   |  03/15/2017 |  
|    4     | John   |  03/18/2017 |  
|    5     | Jim    |  03/18/2017 |  
|    6     | Dave   |  03/30/2017 |  
|    7     | John   |  04/04/2017 |  
|    8     | Jim    |  04/16/2017 |  

我想要的事情是多放一列来指示每个人的第 n 个订单,因为我需要分析用户的重复行为。所以输出应该是这样的:

| Order ID |  User  |  Order Date | n-th |
-----------------------------------------  
|    1     | Dave   |  03/01/2017 |  1   | 
|    2     | Jim    |  03/09/2017 |  1   |
|    3     | John   |  03/15/2017 |  1   |
|    4     | John   |  03/18/2017 |  2   |
|    5     | Jim    |  03/18/2017 |  2   |
|    6     | Dave   |  03/30/2017 |  2   |
|    7     | John   |  04/04/2017 |  3   |
|    8     | Jim    |  04/16/2017 |  3   |

这意味着:

  • 订单 #1 是戴夫的第一个订单
  • 订单 #2 是吉姆的第一订单...
  • 订单 #5 是吉姆的第二个订单

等等!
如何在 SQL 中使用原始查询来获取此信息?
谢谢你。

4

1 回答 1

1

在大多数数据库中,您会使用row_number(). 在 MySQL 中,最好使用变量来完成:

select t.*,
       (@rn := if(@u = user, @rn + 1,
                  if(@u := user, 1, 1)
                 )
       ) as nth
from t cross join
     (select @u := '', @rn := 0) params
order by user, orderdate;

您也可以使用相关子查询来制定此查询,但使用变量的方法应该具有更好的性能。

要将数据恢复为原始格式,请将上述内容用作子查询,然后按订单 ID 排序。

于 2017-04-27T09:14:30.093 回答