【发布时间】:2021-06-02 23:25:51
【问题描述】:
我有一个移动应用浏览历史数据集,如下所示。
- DeviceDateTime:用户在移动应用中查看页面的日期和时间。
- UserID:每个 UserID 代表登录移动应用的访问者。
- PageName:移动应用中有不同的页面。所有访客 将首先登陆主页,然后导航到不同的 页面。
- PageSequence:访问页面的顺序。例如,Seq_1 首页 > Seq_2 我的帐户 = 首先登陆主页,然后导航到“我的 帐户”页面。
| DeviceDateTime | UserID | PageName | PageSequence |
|---|---|---|---|
| 2021-01-19 16:40:00.000 | UserA | Home | Seq_1 |
| 2021-01-19 16:40:00.000 | UserA | My Account | Seq_2 |
| 2021-01-19 16:40:07.000 | UserA | My Activity | Seq_3 |
| 2021-01-19 16:40:07.000 | UserA | Restaurant Listing | Seq_4 |
| 2021-01-19 16:40:18.000 | UserA | Restaurant Details Page | Seq_5 |
| 2021-01-19 16:40:31.000 | UserA | Restaurant Details Page | Seq_6 |
| 2021-01-19 16:40:31.000 | UserA | Restaurant Booking Confirmation | Seq_7 |
| 2021-01-19 16:40:40.000 | UserA | Home | Seq_8 |
| 2021-01-19 16:40:45.000 | UserA | Write To Us | Seq_9 |
| 2021-01-19 16:40:46.000 | UserA | Home | Seq_10 |
| 2021-01-28 21:11:53.000 | UserB | Home | Seq_1 |
| 2021-01-28 21:12:01.000 | UserB | Restaurant Listing | Seq_2 |
| 2021-01-28 21:13:37.000 | UserB | Restaurant Listing | Seq_3 |
| 2021-02-16 09:43:27.000 | UserA | Home | Seq_1 |
| 2021-02-16 09:43:43.000 | UserA | Write To Us | Seq_2 |
| 2021-02-16 09:44:50.000 | UserA | My Account | Seq_3 |
| 2021-02-16 09:45:03.000 | UserA | My Activity | Seq_4 |
我需要在SQL中做如下预处理:
- 将数据集汇总成一个表格,如下所示。我想在表格中显示“FROM”(源页面)和“TO”(目标页面)。例如,有 1 位访问者经历了从“主页”页面到“我的帐户”页面的旅程; 2 位访问者经历了从“主页”页面到“写信给我们”的旅程。
- 当旅程FROM和TO同一页时,不计算旅程。例如,UserA Seq_5 和 Seq_6,“FROM Restaurant Details Page”到“Restaurant Details Page”不应包含在内。
- 不应包括两个不同用户的旅程。例如,不应包含 FROM "Restaurant Listing" (UserB Seq_3) TO "Home" (UserA Seq_1)。
结果表:
| FROM | TO | No_of_Users |
|---|---|---|
| Home | My Account | 1 |
| My Account | My Activity | 2 |
| My Activity | Restaurant Listing | 1 |
| Restaurant Listing | Restaurant Details Page | 1 |
| Restaurant Details Page | Restaurant Booking Confirmation | 1 |
| Restaurant Booking Confirmation | Home | 1 |
| Home | Write To Us | 2 |
| Write To Us | Home | 1 |
| Home | Restaurant Listing | 1 |
| Home | Restaurant Listing | 1 |
| Write To Us | My Account | 1 |
我在数据集中有大约 600,000 个用户和总共 21 个唯一的 PageName。
我尝试了以下脚本,但没有成功。我未能在汇总表中捕获所有可能的旅程。例如,从“写信给我们”到“我的帐户”,从“餐厅预订确认”到“家”都在结果中丢失。
DROP TABLE IF EXISTS #App
CREATE TABLE #App (
DeviceDateTime SMALLDATETIME,
UserID VARCHAR(100),
PageName VARCHAR(100),
PageSequence VARCHAR(100))
INSERT INTO #App VALUES
('2021-01-19 16:40:00.000','UserA', 'Home', 'Seq_1'),
('2021-01-19 16:40:00.000','UserA', 'My Account', 'Seq_2'),
('2021-01-19 16:40:07.000','UserA', 'My Activity', 'Seq_3'),
('2021-01-19 16:40:07.000','UserA', 'Restaurant Listing', 'Seq_4'),
('2021-01-19 16:40:18.000','UserA', 'Restaurant Details Page', 'Seq_5'),
('2021-01-19 16:40:31.000','UserA', 'Restaurant Details Page', 'Seq_6'),
('2021-01-19 16:40:31.000','UserA', 'Restaurant Booking Confirmation', 'Seq_7'),
('2021-01-19 16:40:40.000','UserA', 'Home', 'Seq_8'),
('2021-01-19 16:40:45.000','UserA', 'Write To Use', 'Seq_9'),
('2021-01-19 16:40:46.000','UserA', 'Home', 'Seq_10'),
('2021-01-28 21:11:53.000','UserB', 'Home', 'Seq_1'),
('2021-01-28 21:12:01.000','UserB', 'Restaurant Listing', 'Seq_2'),
('2021-01-28 21:13:37.000','UserB', 'Restaurant Listing', 'Seq_3'),
('2021-02-16 09:43:27.000','UserA', 'Home', 'Seq_1'),
('2021-02-16 09:43:43.000','UserA', 'Write To Us', 'Seq_2'),
('2021-02-16 09:44:50.000','UserA', 'My Account', 'Seq_3'),
('2021-02-16 09:45:03.000','UserA', 'My Activity', 'Seq_4');
DROP TABLE IF EXISTS #SD
with seq_fixed as
(
select
UserID,
DeviceDateTime,
PageName,
cast(right(PageSequence, charindex('_', reverse(PageSequence)) - 1) as int) as pagesequencefinal
from #App
)
, with_next as
(
select
UserID,
DeviceDateTime,
PageName,
lead(PageName) over (partition by UserID, DeviceDateTime order by UserID, DeviceDateTime ASC) as next_pagename
from seq_fixed
group by UserID, DeviceDateTime, PageName
)
select PageName, next_pagename, count(*) AS No_of_User
into #SD
from with_next
where next_pagename is not null
group by PageName, next_pagename
order by PageName, next_pagename;
SELECT * FROM #SD
【问题讨论】:
-
“没用” 为什么没用?它是否出错,给出了意想不到的结果,不受欢迎的行为,或者其他什么?你实际上在这里问什么?您在这里向我们倾倒了大量代码、数据和文本,但我看不到明确的问题陈述(除了“它不起作用”,它什么也没告诉我们)和问题。纯粹是因为您没有正确终止所有语句,因此您的 CTE 语句失败了吗?
-
@Larnu 我为混乱道歉。我设法得到了一个非常接近的结果,但我未能在汇总表中捕获所有可能的旅程。例如,从“写信给我们”到“我的帐户”,从“餐厅预订确认”到“家”都在结果中缺失。
标签: sql sql-server count left-join aggregate