2016-05-31 3 views
0

У меня есть таблица подобное, как это:Ранг последовательности в SQL

User ID creation_time Clicked Rank 
2.30417E+13 10:39:03 AM FALSE 1 
2.30417E+13 10:40:35 AM TRUE 1 
2.30417E+13 10:40:36 AM TRUE 2 
2.30417E+13 10:40:50 AM FALSE 1 
2.30417E+13 10:41:20 AM TRUE 1 
2.30417E+13 10:41:36 AM TRUE 2 
2.30417E+13 10:42:41 AM TRUE 3 
2.30417E+13 10:42:41 AM TRUE 4 
2.30417E+13 10:44:23 AM TRUE 5 
2.30417E+13 10:44:34 AM TRUE 6 
2.30417E+13 10:44:36 AM TRUE 7 
2.30417E+13 10:44:39 AM TRUE 8 
2.30417E+13 10:44:44 AM TRUE 9 
2.30417E+13 10:44:50 AM TRUE 10 
2.30417E+13 10:44:53 AM TRUE 11 
2.30417E+13 10:44:56 AM TRUE 12 
2.30417E+13 10:45:05 AM TRUE 13 
2.30417E+13 10:45:40 AM FALSE 1 
2.30417E+13 10:45:41 AM TRUE 1 
2.30417E+13 10:46:07 AM TRUE 2 
2.30417E+13 10:46:07 AM TRUE 3 
2.30417E+13 10:46:08 AM TRUE 4 

столбец ранга, как я хотел бы ранжировать строки. в таблице у меня сотни пользователей, и я хочу ранжировать каждого пользователя в соответствии с последовательностями кликов/без кликов, которые он сделал. Любая идея? я пробовал ранг, row_number, разные настройки из них .. не могу понять это.

+0

Lead (windowfunction/analytic), чтобы смотреть в будущее на следующее значение и когда false, а затем сбросить ранг до 1. – xQbert

+0

Используете ли вы Postgres или Amazon Redshift? Пожалуйста, отметьте тег и название правильно. –

ответ

0

Вам нужна колонка группировки для row_number(). Это можно рассчитать как текущую сумму значений идентификатора пользователя и щелчка столбца, при нажатии которого значение false.

Итак:

select t.*, 
     row_number() over (partition by userid, clicked, grp order by creation_time) as rank 
from (select t.*, 
      sum(case when clicked = false then 1 else 0 end) over (partition by userid order by creation_time) as grp 
     from t 
    ) t; 

Иногда, Amazon требует пункт оконную для оконных функций, так что вам может понадобиться rows between unbounded preceding and current row. Postgres не имеет этого требования.

+0

К сожалению, это не работает для меня, вот сценарий: 'sum (case when clicked = 0 then 1 else 0 end) over (раздел по порядку user_id by creation_time asc строк между неограниченной предыдущей и текущей строкой) как grp' и здесь это верхний запрос: 'row_number() over (раздел пользователем_id, щелкнул, grp order by creation_time), поскольку rank 'результат ранга - это просто последовательность из 1, для таблицы примеров, которую я показал в вопросах. – Uri

+0

Может ли проблема быть нажата = 0? –

+0

Нет .. Я попробовал преобразовать его в двоичный/использовал оригинал false/true. Кажется, что группа grp реагирует на изменения, но номер строки просто бросает их. grp является суммарной суммой, а при нажатии - false, число не меняется (1 2 2 3 4 5 ..) – Uri

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