2015-06-28 2 views
0

я пытаюсь написать HiveQL (или даже ANSI SQL) запроса, который может ответить на следующий:SQL - Количество сеансов и сделок между сессией

У меня есть база данных с событиями (сделками), каждое событие хранятся с a user_id и trans_time (время транзакции). A user_id может иметь неограниченные события, даже возможно иметь несколько событий с тем же trans_time.

Если я установил окно активности времени (то есть 10 секунд), сколько окон было, сколько событий в этом окне? Я думаю, что результат будет примерно таким (очевидно, без слов, просто цифр) ...
100 окон имели только 1 событие
50 окон имели 2 события
.
.
1 окно, в котором было 30 событий

Чтобы описать первый результат ... В наборе данных было 100 экземпляров, где в течение 10 секунд было всего 1 событие.

Есть ли способ, чтобы вытащить другой показатель из тех же данных, что говорит, 50 user_ids был только 1 событие
25 user_ids были 2 события
.
.
1 user_id has 30 events

Чтобы описать первый результат ... Было 50 пользовательских_пользователей, которые имели только 1 событие в 10-секундном окне.

Я надеюсь, что это не слишком туманно. Как всегда, спасибо!

+0

Трудно понять, что вы после. Пример вашей таблицы и желаемый результат будут экспоненциально увеличивать вероятность ответа на ваш вопрос. – gobrewers14

ответ

1

, если ваши окна являются статическими, например:
окна 1 - 12:00:00 - 12:00:09
окно 2 - 12:00:10 - 12:00:19 т.д.

Вы можете сделать это:

-- this counts number of windows per with same number of events 
select events_in_window,count(*) windows 
from (
    -- this counts events in each window 
    select window ,count(*) events_in_window 
    from (
     -- this rounds all the transactions to windows 
     select user_id,from_unixtime(floor(unix_timestamp(trans_time)/10)*10) window 
     from table) a 
    group by window) b 
group by events_in_window 

Обратите внимание на "10" в trans_time "округление". вы можете изменить его на любой размер окон, в котором вы нуждаетесь.

Смежные вопросы