【问题标题】:geting the purchase number based on user ID in mysql根据mysql中的用户ID获取购买号
【发布时间】:2020-01-16 18:58:30
【问题描述】:

我正在尝试获取第四列,其中获取该用户的购买编号,我有以下数据:

user   date          purchase_id
a      01-01-2018    1
b      02-01-2018    2
a      02-01-2018    3
a      03-01-2018    4
b      04-01-2018    5
a      04-01-2018    6

并且想得到这样的东西:

user   date          purchase_id  purchase_order
a      01-01-2018    1            1
b      02-01-2018    2            1
a      02-01-2018    3            2
a      03-01-2018    4            3
b      04-01-2018    5            2
a      04-01-2018    6            4

它的最终用途是建立一个同期群分析来检查用户留存率。 谢谢

【问题讨论】:

  • 采购订单信息从何而来?它是数据库中的另一个表吗?如果是这样,我们还需要该表的结构。
  • 没有。只有一张桌子。我认为这可以根据日期以某种方式完成,我将该日期与其余数据进行比较。像每行检查有多少行具有相同的用户 ID 和较小的日期

标签: mysql sql database date window-functions


【解决方案1】:

您似乎正在寻找ROW_NUMBER()(在 MySQL 8.0 中可用)。此窗口函数可用于对共享同一user 的组内的记录进行排名。

SELECT
    user,
    date,
    purchase_id,
    ROW_NUMBER() OVER(PARTITION BY user ORDER BY purchase_id ) purchase_order
FROM mytable

注意:不清楚您要使用哪一列进行排序。可能是purchase_id(如上面的查询所示),也可能是date:您可以根据需要更改查询。

Demo on DB Fiddle

| user | date       | purchase_id | purchase_order |
| ---- | ---------- | ----------- | -------------- |
| a    | 2018-01-01 | 1           | 1              |
| a    | 2018-01-02 | 3           | 2              |
| a    | 2018-01-03 | 4           | 3              |
| a    | 2018-01-04 | 6           | 4              |
| b    | 2018-01-02 | 2           | 1              |
| b    | 2018-01-04 | 5           | 2              |

【讨论】:

    【解决方案2】:

    仅适用于 8.0 之前的版本...

    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (purchase_id SERIAL PRIMARY KEY
    ,user CHAR(1) NOT NULL
    ,date DATE NOT NULL
    );
    
    INSERT INTO my_table VALUES
    (1,'a','2018-01-01'),
    (2,'b','2018-01-02'),
    (3,'a','2018-01-02'),
    (4,'a','2018-01-03'),
    (5,'b','2018-01-04'),
    (6,'a','2018-01-04');    
    
    SELECT a.purchase_id
         , a.user
         , a.date
         , a.i rank
      FROM 
         ( SELECT x.*
                , CASE WHEN @prev = user THEN @i:=@i+1 ELSE @i:=1 END i
                , @prev := user
             FROM my_table x
                , (SELECT @prev:=null,@i:=0) vars 
            ORDER 
               BY user
                , date
         ) a
     ORDER   
        BY purchase_id;
    +-------------+------+------------+------+
    | purchase_id | user | date       | rank |
    +-------------+------+------------+------+
    |           1 | a    | 2018-01-01 |    1 |
    |           2 | b    | 2018-01-02 |    1 |
    |           3 | a    | 2018-01-02 |    2 |
    |           4 | a    | 2018-01-03 |    3 |
    |           5 | b    | 2018-01-04 |    2 |
    |           6 | a    | 2018-01-04 |    4 |
    +-------------+------+------------+------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 2021-07-26
      相关资源
      最近更新 更多