2015-03-14 2 views
0

Извинения за глупый заголовок вопроса, но не смогли придумать ничего более описательного.Группа SQL без группы

У меня есть следующие данные в моей таблице:

Name; Day ; Mood 
---------------- 
Bob; Fri; Sad 
Bob; Thu; Sad 
Bob; Wed; Happy 
Bob; Tue; Happy 
Bob; Mon; Sad 

Предположим, что это суббота. Вы знаете, что Боб груб (вы сгруппированы по имени, и вы достигли максимума в течение дня). Однако вы хотели бы знать, с тех пор, как Боб грустный.

Ответ с четверга. Я хотел бы написать SQL-запрос, который мне это говорит. Проблема связана с понедельником, так как, написав запрос наивно, можно сделать вывод, что Боб грустен с тех пор, как Мон. Это, однако, было бы неправильно, из-за Счастливого настроения в Tue и Wed.

Любая помощь очень ценится (может быть специфичной для Oracle).

ответ

1

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

select max(date) as date, mood 
from (select t.*, 
      (row_number() over (order by date) - 
       row_number() over (partition by mood order by date) 
      ) as grp 
     from table t 
    ) t 
group by grp, mood 
order by max(date) desc 
fetch first 1 row only; 

Oracle 12 поддерживает окончательный пункт fetch first 1 row only. В более ранних версиях вы можете сделать то же самое с подзапросом и where rownum = 1.

+0

спасибо! Тем не менее, мне потребуется некоторое время, чтобы понять, что именно происходит в этом запросе. Тем временем, однако, я получаю ошибку «Отсутствие правильной скобки». Я попытался исправить, но я потерпел неудачу. Не могли бы вы помочь? –

+1

@SimonRighley. , , Это поможет, если вы просто сосредоточьтесь на подзапросе, посмотрите на два значения числа строк отдельно, а затем посмотрите, что делает разница. –

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