2015-12-09 3 views
4

У меня есть следующие таблицы/данные:PostgreSQL - выберите кол повторяющихся последовательностей непрерывных

| user_id | action_id | data  | 
------------------------------------- 
| 10  | 1  | fly   | 
| 10  | 2  | train  | 
| 10  | 3  | fly   | 
| 10  | 4  | fly   | 
| 10  | 5  | fly   | 
| 10  | 6  | train  | 
| 10  | 7  | fly   | 
| 10  | 8  | train  | 
| 10  | 9  | fly   | 
| 10  | 10  | fly   | 

Есть ли способ в PostgreSQL графы повторил непрерывный «летать» вхождений? В этом примере, результаты должны быть:

counts 
------ 
    1 
    3 
    1 
    2 
+0

Проверьте это: [Row Number Over Partition] (http://stackoverflow.com/questions/25562542/postgresql-window-function-row-number-over-partition-col-order-by-col2) –

+0

Да, я знаю о функции окна, но раздел не применим Вот. Я попробовал некоторые варианты с разделом без успеха. Я также попробовал некоторые варианты с функцией окна с порядком и достигал результатов, близких к необходимому с абсолютно уродливым SQL. Но ответ @ sstan очень прост, это действительно здорово! –

ответ

3

Да, это возможно, используя функцию lag окна и накопленную сумму:

with FlagCTE as (
    select t.action_id, t.data, 
     case when t.data = 'fly' and t.data = lag(t.data) over (order by t.action_id) then 0 else 1 end as Flag 
    from some_table t), 
GroupCTE as (
    select t.action_id, 
     t.data, 
     sum(t.Flag) over (order by t.action_id) as GroupId 
    from FlagCTE t 
    where t.data = 'fly') 
select count(*) as counts 
    from GroupCTE t 
group by t.GroupId 
order by t.GroupId 

SQLFiddle Demo

+0

ничего себе ... симпатичный трюк! это действительно здорово! –

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