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
.
执行相同的操作
很抱歉问题的愚蠢标题,但无法提出更具描述性的内容。
我的 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
.