SQL 不分组

SQL group by without group

很抱歉问题的愚蠢标题,但无法提出更具描述性的内容。

我的 table 中有以下数据:

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

假设今天是星期六。你知道 Bob 很伤心(你按 Name 分组,并且你在 Day 中达到最大值)。但是,您想知道 Bob 是从什么时候开始伤心的。

答案是从星期四开始的。我想写一个 SQL 查询来告诉我这一点。问题出在星期一,因为通过天真地编写查询,可以得出 Bob 从星期一开始就很伤心的结论。然而,这是错误的,因为周二和周三的心情愉快。

非常感谢任何帮助(可以是特定于 Oracle 的)。

您可以使用 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.

执行相同的操作