Reputation: 185
I am trying to get a fouth column where I get the purchase number of that user, I have this data:
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
and would like to get something like this:
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
The final use of this is to build a cohort analysis to check user retention. Thanks
Upvotes: 0
Views: 149
Reputation: 33945
Exclusively for versions prior to 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 |
+-------------+------+------------+------+
Upvotes: 2
Reputation: 222582
You seem to be looking for ROW_NUMBER()
(available in MySQL 8.0). This window function can be used to rank records within groups sharing the same user
.
SELECT
user,
date,
purchase_id,
ROW_NUMBER() OVER(PARTITION BY user ORDER BY purchase_id ) purchase_order
FROM mytable
NB: it is unclear what column you want to use for ordering. It could be purchase_id
(as show in the above query), or maybe date
: you can change the query as per your requirement.
| 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 |
Upvotes: 3