T-SQL - превратить таблицу с текущей страницей и предыдущими страницами в последовательный порядок за сеанс - PullRequest
1 голос
/ 08 апреля 2019

Я пытаюсь создать таблицу для отображения активности за сеанс на веб-сайте.Должно выглядеть примерно так

Предпочитаемая таблица:

+------------+---------+--------------+-----------+
| 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, но может быть вычтенна основе времени и пути.

Текущая таблица:

+------------------+---------+------------+---------------+----------+
| 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 |
+------------------+---------+------------+---------------+----------+

Как лучше всего превратить текущую таблицу в предпочтительный формат таблицы?

Я пытался искать вложенные таблицы, зацикленные таблицы, пока не нашел что-то связанное с этой проблемой.

1 Ответ

0 голосов
/ 08 апреля 2019

Так что, если вы можете рисковать сессиями, начинающимися в одно и то же время с одинаковой продолжительностью, это должно быть достаточно просто сделать с помощью рекурсивного запроса.

;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 состояние.

Вот рабочий пример для dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...