SQL 用最小值和最大值分组
SQL Group with Min and Max
我有一个使用 group by 的超级简单查询,但我不知道如何获得所需的结果。它实际上是一个使用 min() 和 max() 的简单查询。我有一个 table,其中资产属于日期为 in/out 的某个位置(它也有多个 in/out 日期而不更改位置),但是如果资产移回其先前所在的位置已经,分组不起作用。我试过结合over(partition by...),就是解决不了
Table:
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
这是一个 groups-and-islands 问题。一个简单的解决方案是行号的差异:
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);
为什么这行得通有点难以解释。如果您查看子查询,您将看到行号的差异如何定义您想要的连续行。
我有一个使用 group by 的超级简单查询,但我不知道如何获得所需的结果。它实际上是一个使用 min() 和 max() 的简单查询。我有一个 table,其中资产属于日期为 in/out 的某个位置(它也有多个 in/out 日期而不更改位置),但是如果资产移回其先前所在的位置已经,分组不起作用。我试过结合over(partition by...),就是解决不了
Table:
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
这是一个 groups-and-islands 问题。一个简单的解决方案是行号的差异:
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);
为什么这行得通有点难以解释。如果您查看子查询,您将看到行号的差异如何定义您想要的连续行。