在 MySQL 中动态将行转列 - 每个用户的网页排名
Transpose Rows to Columns Dynamically in MySQL - Page Rank Per User
我有以下数据框。我想创建一个新的 table 每个用户查看最多的 4 个页面(页面和查看次数)。
因此,我需要转置以下列:页面、数量和排名。
请注意,要排序的变量是排名,不一定是所有页面中的所有名称。
必然有4列。
drop table sessions;
CREATE TABLE IF NOT EXISTS sessions (
id int(11),
name varchar(10),
page varchar(10),
quantity int(11),
rank int(11)
);
insert into sessions values (1,'joan','home',15,1);
insert into sessions values (1,'joan','search',8,2);
insert into sessions values (1,'joan','vip',4,3);
insert into sessions values (1,'joan','checkout',2,4);
insert into sessions values (2,'fill','home',20,1);
insert into sessions values (2,'fill','vip',2,2);
insert into sessions values (3,'mery','search',10,1);
insert into sessions values (3,'mery','checkout',7,2);
insert into sessions values (3,'mery','home',5,3);
id name page quantity rank
1. joan home 15 1
1. joan search 8 2
1 joan vip 4 3
1 joan checkout 2 4
2 fill home 20 1
2 fill vip 2 2
3 mery search 10 1
3 mery checkout 7 2
3 mery home 5 3
最终需要的输出。
id name page1 quantity1 page2 quantity2 page3 quantity3 page4 quantity4
1 joan home 15 search 8 vip 4 checkout 2
2 fill home 20 vip 2
3 mery search 10 checkout 7 home 5
您可以使用条件聚合:
select
id,
name,
max(case when rank = 1 then page end) page1,
max(case when rank = 1 then quantity end) quantity1,
max(case when rank = 2 then page end) page2,
max(case when rank = 2 then quantity end) quantity2,
max(case when rank = 3 then page end) page3,
max(case when rank = 3 then quantity end) quantity3,
max(case when rank = 4 then page end) page4,
max(case when rank = 4 then quantity end) quantity4
from sessions
group by id, name
id | name | page1 | quantity1 | page2 | quantity2 | page3 | quantity3 | page4 | quantity4
-: | :--- | :----- | --------: | :------- | --------: | :---- | --------: | :------- | --------:
1 | joan | home | 15 | search | 8 | vip | 4 | checkout | 2
2 | fill | home | 20 | vip | 2 | null | null | null | null
3 | mery | search | 10 | checkout | 7 | home | 5 | null | null
我有以下数据框。我想创建一个新的 table 每个用户查看最多的 4 个页面(页面和查看次数)。
因此,我需要转置以下列:页面、数量和排名。
请注意,要排序的变量是排名,不一定是所有页面中的所有名称。 必然有4列。
drop table sessions;
CREATE TABLE IF NOT EXISTS sessions (
id int(11),
name varchar(10),
page varchar(10),
quantity int(11),
rank int(11)
);
insert into sessions values (1,'joan','home',15,1);
insert into sessions values (1,'joan','search',8,2);
insert into sessions values (1,'joan','vip',4,3);
insert into sessions values (1,'joan','checkout',2,4);
insert into sessions values (2,'fill','home',20,1);
insert into sessions values (2,'fill','vip',2,2);
insert into sessions values (3,'mery','search',10,1);
insert into sessions values (3,'mery','checkout',7,2);
insert into sessions values (3,'mery','home',5,3);
id name page quantity rank
1. joan home 15 1
1. joan search 8 2
1 joan vip 4 3
1 joan checkout 2 4
2 fill home 20 1
2 fill vip 2 2
3 mery search 10 1
3 mery checkout 7 2
3 mery home 5 3
最终需要的输出。
id name page1 quantity1 page2 quantity2 page3 quantity3 page4 quantity4
1 joan home 15 search 8 vip 4 checkout 2
2 fill home 20 vip 2
3 mery search 10 checkout 7 home 5
您可以使用条件聚合:
select
id,
name,
max(case when rank = 1 then page end) page1,
max(case when rank = 1 then quantity end) quantity1,
max(case when rank = 2 then page end) page2,
max(case when rank = 2 then quantity end) quantity2,
max(case when rank = 3 then page end) page3,
max(case when rank = 3 then quantity end) quantity3,
max(case when rank = 4 then page end) page4,
max(case when rank = 4 then quantity end) quantity4
from sessions
group by id, name
id | name | page1 | quantity1 | page2 | quantity2 | page3 | quantity3 | page4 | quantity4 -: | :--- | :----- | --------: | :------- | --------: | :---- | --------: | :------- | --------: 1 | joan | home | 15 | search | 8 | vip | 4 | checkout | 2 2 | fill | home | 20 | vip | 2 | null | null | null | null 3 | mery | search | 10 | checkout | 7 | home | 5 | null | null