【问题标题】:SQL Group with Min and Max具有最小值和最大值的 SQL 组
【发布时间】:2021-01-03 10:24:03
【问题描述】:

我有一个使用 group by 的超级简单查询,但我不知道如何获得所需的结果。这实际上是一个使用 min() 和 max() 的简单查询。我有一张表,其中资产属于某个位置,有一个日期输入/输出(它也有多个输入/输出日期而不更改位置),但是如果资产移回它以前已经存在的位置,则分组不会工作。我试过用over(partition by...)的组合,就是解决不了。

表:

Asset   Location    Date In     Date Out
------------------------------------------
00001   A           01/01/2020  13/01/2020
00001   A           14/01/2020  26/01/2020
00001   A           27/01/2020  08/02/2020
00001   B           09/02/2020  21/02/2020
00001   B           22/02/2020  05/03/2020
00001   B           06/03/2020  18/03/2020
00001   A           19/03/2020  31/03/2020
00001   A           01/04/2020  13/04/2020
00001   A           14/04/2020  26/04/2020
00001   A           27/04/2020  09/05/2020
00001   A           10/05/2020  16/09/2020

想要的结果:

Asset   Location    Date In     Date Out
------------------------------------------
00001   A           01/01/2020  08/02/2020
00001   B           09/02/2020  18/03/2020
00001   A           19/03/2020  16/09/2020

实际结果:

Asset   Location    Date In     Date Out
------------------------------------------
00001   A           01/01/2020  16/09/2020
00001   B           09/02/2020  18/03/2020

【问题讨论】:

  • 向我们展示您尝试过的查询

标签: sql oracle group-by max min


【解决方案1】:

这是一个群岛问题。一个简单的解决方案是行号的差异:

select asset, location, min(date_in), max(date_out)
from (select t.*,
             row_number() over (partition by asset order by date_in) as seqnum             
             row_number() over (partition by asset, location order by date_in) as seqnum_2
      from t
     ) t
group by asset, location, (seqnum - seqnum_2);

为什么这行得通有点难以解释。如果您查看子查询,您将看到行号的差异如何定义您想要的连续行。

【讨论】:

  • 我完全理解。正是我所追求的。非常感谢!我要学的东西太多了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多