Py学习  »  DATABASE

在mysql中基于用户id获取购买号

Luis • 5 年前 • 1658 次点击  

我试图在第四列中获得该用户的购买号码,我有以下数据:

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

最后一个用途是建立一个群组分析来检查用户保留率。 谢谢

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40918
 
1658 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Strawberry
Reply   •   1 楼
Strawberry    5 年前

仅适用于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 |
+-------------+------+------------+------+
GMB
Reply   •   2 楼
GMB    5 年前

你好像在找 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              |