Oracle SQL: подсчет последовательных посещений сайта по подстроке и предыдущей (лаговой) строке - PullRequest
0 голосов
/ 13 января 2020

Используя Oracle SQL, я пытаюсь рассчитать общее количество уникальных посещений сайта. Таблица, которую я использую для написания запроса, не имеет метки времени, которая включает минуты и секунды, только DDMMYY, и каждая строка в таблице представляет клик клиента на странице. Таблица обозначает новый «сеанс» каждый час, независимо от того, отражает ли это фактически новое посещение от POV клиента. Что я должен сделать, это использовать непоследовательные сессии в качестве прокси для уникальных посещений. Таким образом, если между посещениями есть часовой перерыв, предыдущей последовательной группировкой считается одно посещение. Я определяю визит как уникальную комбинацию идентификатора клиента + день сеанса + час сеанса. Если в комбинации клиент + день имеются последовательные часы сеансов, я считаю это одним сеансом. Поле HOUR содержит строковые значения, которые объединяют дату с часом. Для того, чтобы сделать соответствующий расчет количества посещений, мне нужно будет разобрать час и вычесть из предыдущей строки (задержки), чтобы определить, больше ли это «разрыв» часа.

Example of Raw Data:
TRANS_TO_DATE   CUSTOMER_ID HOUR
10/21/17        1007589445  October 21, 2017, Hour 1
10/21/17        1007589445  October 21, 2017, Hour 2
10/21/17        1007589445  October 21, 2017, Hour 2
10/21/17        1007589445  October 21, 2017, Hour 2
10/21/17        1007589445  October 21, 2017, Hour 3
10/21/17        1007589445  October 21, 2017, Hour 5
10/21/17        1007589445  October 21, 2017, Hour 6
10/21/17        1007589445  October 21, 2017, Hour 23
10/21/17        1007589445  October 21, 2017, Hour 23
10/21/17        1007589445  October 21, 2017, Hour 23
11/1/17         1007589445  November 1, 2017, Hour 10
1/1/18          1007589445  January  1, 2018, Hour 10
1/1/18          1007589445  January  1, 2018, Hour 10
1/1/18          1007589445  January  1, 2018, Hour 11
1/1/18          1007589445  January  1, 2018, Hour 14
1/1/18          1007589445  January  1, 2018, Hour 20
1/1/18          1007589445  January  1, 2018, Hour 22

Количество посещений на самом деле таково:

Customer_id Day Hour    Visit Grouping 
1007589445  October 21, 2017    1   Visit 1
1007589445  October 21, 2017    2   Visit 1
1007589445  October 21, 2017    3   Visit 1
1007589445  October 21, 2017    5   Visit 2
1007589445  October 21, 2017    6   Visit 2
1007589445  October 21, 2017    23  Visit 3
1007589445  November 1, 2017    10  Visit 1
1007589445  January 1, 2018 10  Visit 1
1007589445  January 1, 2018 11  Visit 1
1007589445  January 1, 2018 14  Visit 2
1007589445  January 1, 2018 20  Visit 3
1007589445  January 1, 2018 21  Visit 4

Клиент 1007589445 имел

3 посещения 21 октября 2017 г. - 1 посещение 1 ноября 2017 г. - 4 посещения на 1 января 2018 года

Всего посещений: 8

Ниже приведен код sql, который у меня имеется, который должен быть изменен, чтобы соответствовать приведенным выше критериям.

select 
CUSTOMER_ID, 
TRANS_TO_DATE,
HOUR,
count (HOUR) as visits
from mstr_clickstream_vw 
where trans_to_date between start_date and end_date
and web_store_ind='US'
 group by CUSTOMER_ID, TRANS_TO_DATE,HOUR

1 Ответ

0 голосов
/ 13 января 2020

Вы можете получить час с помощью:

cast(trim(substr(hour, -2)) as int)

Затем, чтобы использовать это для назначения сеансов с помощью lag() и совокупной условной агрегации:

select cs.*,
       sum(case when trans_to_date = prev_ttd and prev_hh = hh then 0
                when trans_to_date = prev_ttd and prev_hh = hh - 1 then 0
                when hh = 0 and prev_hh = 23 and trans_to_date = prev_ttd + interval '1' day then 0
                else 1
           end) over (partition by customer_id order by trans_to_date, hh) as grouping
from (select cs.*,
             lag(trans_to_date) over (partition by customer_id order by trans_to_date, hh) as prev_ttd,
             lag(hh) over (partition by customer_id order by trans_to_date, hh) as prev_hh
      from (select cs.*,
                   cast(trim(substr(hour, -2)) as int) as hh
            from mstr_clickstream_vw cs
           ) cs
      ) cs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...