对问题的愚蠢标题道歉,但无法提出任何更具描述性的内容。
我的表中有以下数据:
Name; Day ; Mood
----------------
Bob; Fri; Sad
Bob; Thu; Sad
Bob; Wed; Happy
Bob; Tue; Happy
Bob; Mon; Sad
假设是星期六。你知道鲍勃是悲伤的(你按名字分组,并且你超过了这一天)。但是,你想知道Bob是悲伤的时候。
答案是从星期四开始。我想写一个告诉我的SQL查询。问题出在星期一,因为通过天真地写下查询,可以得出结论,自周一以来鲍勃是悲伤的。然而,由于周二和周三的快乐心情,这是错误的。
非常感谢任何帮助(可以是Oracle特定的)。
答案 0 :(得分: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
执行相同的操作。