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)作为prevPagePageSeq = 1。然后在递归部分访问时间戳比前一个晚在 prev.page = next.PrevPage 条件下加入具有相同持续时间的页面。

Here's a working example on dbfiddle