T-SQL - 将当前页面和前几页的 table 转换为每个会话的连续顺序
T-SQL - Turn table with current page and previous pages into a sequential order per session
我正在尝试创建一个 table 来显示网站上每个会话的活动。
应该看起来像那样
首选 table:
+------------+---------+--------------+-----------+
| SessionID | PageSeq| Page | Duration |
+------------+---------+--------------+-----------+
| 1 | 1 | Home | 5 |
| 1 | 2 | Sales | 10 |
| 1 | 3 | Contact | 9 |
| 2 | 1 | Sales | 5 |
| 3 | 1 | Home | 30 |
| 3 | 2 | Sales | 5 |
+------------+---------+--------------+-----------+
可惜我现在的数据集中没有session_id的信息,不过可以根据时间和路径推算出来。
当前 table:
+------------------+---------+------------+---------------+----------+
| DATE_HOUR_MINUTE | Page | Prev_page | Total_session | Duration |
+------------------+---------+------------+---------------+----------+
| 201801012020 | Home | (entrance) | 24 | 5 |
| 201801012020 | Sales | Home | 24 | 10 |
| 201801012020 | Contact | Sales | 24 | 9 |
| 201801012020 | Sales | (entrance) | 5 | 5 |
| 201801012020 | Home | (entrance) | 35 | 30 |
| 201801012020 | Sales | Home | 35 | 5 |
+------------------+---------+------------+---------------+----------+
将当前 table 格式转换为首选 table 格式的最佳方法是什么?
我已经尝试搜索嵌套的 tables,循环的 tables,还没有找到与此问题相关的内容。
因此,如果您可以冒险在同一时间开始相同持续时间的会话,那么使用递归查询应该很容易做到。
;WITH sessionTree AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as sessionId
, 1 AS PageSeq
, *
FROM Session
WHERE PrevPage = '(entrance)'
UNION ALL
SELECT prev.sessionId
, prev.PageSeq + 1
, next.*
FROM sessionTree prev
JOIN Session next
ON next.TotalDuration = prev.TotalDuration
AND next.PrevPage = prev.Page
AND next.date_hour_minute >= prev.date_hour_minute
)
SELECT * FROM sessionTree
ORDER BY sessionId, PageSeq
sessionId
为每个条目生成(entrance)
作为prevPage
,PageSeq
= 1。然后在递归部分访问时间戳比前一个晚在 prev.page = next.PrevPage
条件下加入具有相同持续时间的页面。
我正在尝试创建一个 table 来显示网站上每个会话的活动。 应该看起来像那样
首选 table:
+------------+---------+--------------+-----------+
| SessionID | PageSeq| Page | Duration |
+------------+---------+--------------+-----------+
| 1 | 1 | Home | 5 |
| 1 | 2 | Sales | 10 |
| 1 | 3 | Contact | 9 |
| 2 | 1 | Sales | 5 |
| 3 | 1 | Home | 30 |
| 3 | 2 | Sales | 5 |
+------------+---------+--------------+-----------+
可惜我现在的数据集中没有session_id的信息,不过可以根据时间和路径推算出来。
当前 table:
+------------------+---------+------------+---------------+----------+
| DATE_HOUR_MINUTE | Page | Prev_page | Total_session | Duration |
+------------------+---------+------------+---------------+----------+
| 201801012020 | Home | (entrance) | 24 | 5 |
| 201801012020 | Sales | Home | 24 | 10 |
| 201801012020 | Contact | Sales | 24 | 9 |
| 201801012020 | Sales | (entrance) | 5 | 5 |
| 201801012020 | Home | (entrance) | 35 | 30 |
| 201801012020 | Sales | Home | 35 | 5 |
+------------------+---------+------------+---------------+----------+
将当前 table 格式转换为首选 table 格式的最佳方法是什么?
我已经尝试搜索嵌套的 tables,循环的 tables,还没有找到与此问题相关的内容。
因此,如果您可以冒险在同一时间开始相同持续时间的会话,那么使用递归查询应该很容易做到。
;WITH sessionTree AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as sessionId
, 1 AS PageSeq
, *
FROM Session
WHERE PrevPage = '(entrance)'
UNION ALL
SELECT prev.sessionId
, prev.PageSeq + 1
, next.*
FROM sessionTree prev
JOIN Session next
ON next.TotalDuration = prev.TotalDuration
AND next.PrevPage = prev.Page
AND next.date_hour_minute >= prev.date_hour_minute
)
SELECT * FROM sessionTree
ORDER BY sessionId, PageSeq
sessionId
为每个条目生成(entrance)
作为prevPage
,PageSeq
= 1。然后在递归部分访问时间戳比前一个晚在 prev.page = next.PrevPage
条件下加入具有相同持续时间的页面。