Select min/max 来自由一列定义为另一列的子组的组 - SQL,HPVertica
Select min/max from group defined by one column as subgroup of another - SQL, HPVertica
我正在尝试查找另一个组的子组中的最小和最大日期。这是示例 'data'
ID Type Date
1 A 7/1/2015
1 B 1/1/2015
1 A 8/5/2014
22 B 3/1/2015
22 B 9/1/2014
333 A 8/1/2015
333 B 4/1/2015
333 B 3/29/2014
333 B 2/28/2013
333 C 1/1/2013
我想确定的是 - 在一个 ID 中,每个类似类型的块的 min/max 日期是什么?所以对于 ID # 333,我需要以下信息:
A: min & max = 8/1/2015
B: min = 2/28/2013
max = 4/1/2015
C: min & max = 1/1/2013
我无法弄清楚如何在一组 ID 中仅识别不间断的类型分组。对于 ID #1,我需要保留两个 'A' 具有单独 min/max 日期的类型,因为它们被类型 'B' 分开,所以我不能只提取所有的最小日期为 ID #1 输入 A,它必须是两个独立的实例。
我试过的是类似于下面两行的内容,但是这两行都没有准确地捕捉到上面提到的 ID #1 中类型 B 中断类型 A 的情况。
Max(Date) OVER (Partition By ID, Type)
or this:
Row_Number() OVER (Partition By ID, Type ORDER BY Date DESC)
,then selecting Row #1 for max date, and date ASC w/ row #1 for min date
感谢您提供的任何见解!
如果我没理解错的话,您希望 id/type 的 min/max 值使用降序日期排序进行分组,但要注意的是您希望它们基于 id 中的时间簇。
您可以做的是使用 CONDITIONAL_CHANGE_EVENT
标记类型更改的行,然后在标准 min/max 聚合的 GROUP BY
中使用它。
这将是实现您想要的目标的中间步骤:
select ID, Type, Date,
CONDITIONAL_CHANGE_EVENT(Type) OVER( PARTITION BY ID ORDER BY Date desc) cce
from mytable
group by ID, Type, Date
order by ID, Date desc, Type
ID Type Date cce
1 A 2015-07-01 00:00:00 0
1 B 2015-01-01 00:00:00 1
1 A 2014-08-05 00:00:00 2
22 B 2015-03-01 00:00:00 0
22 B 2014-09-01 00:00:00 0
333 A 2015-08-01 00:00:00 0
333 B 2015-04-01 00:00:00 1
333 B 2014-03-29 00:00:00 1
333 B 2013-02-28 00:00:00 1
333 C 2013-01-01 00:00:00 2
使用 CCE 将它们分组后,您可以对其进行聚合以获得您要在 cce 上进行分组的 min/max。你可以玩一下底部的顺序,这个顺序对我来说似乎最有意义。
select id, type, min(date), max(date)
from (
select ID, Type, Date,
CONDITIONAL_CHANGE_EVENT(Type) OVER( PARTITION BY ID ORDER BY Date desc) cce
from mytable
group by ID, Type, Date
) x
group by id, type, cce
order by id, 3 desc, 4 desc;
id type min max
1 A 2015-07-01 00:00:00 2015-07-01 00:00:00
1 B 2015-01-01 00:00:00 2015-01-01 00:00:00
1 A 2014-08-05 00:00:00 2014-08-05 00:00:00
22 B 2014-09-01 00:00:00 2015-03-01 00:00:00
333 A 2015-08-01 00:00:00 2015-08-01 00:00:00
333 B 2013-02-28 00:00:00 2015-04-01 00:00:00
333 C 2013-01-01 00:00:00 2013-01-01 00:00:00
我正在尝试查找另一个组的子组中的最小和最大日期。这是示例 'data'
ID Type Date
1 A 7/1/2015
1 B 1/1/2015
1 A 8/5/2014
22 B 3/1/2015
22 B 9/1/2014
333 A 8/1/2015
333 B 4/1/2015
333 B 3/29/2014
333 B 2/28/2013
333 C 1/1/2013
我想确定的是 - 在一个 ID 中,每个类似类型的块的 min/max 日期是什么?所以对于 ID # 333,我需要以下信息:
A: min & max = 8/1/2015
B: min = 2/28/2013
max = 4/1/2015
C: min & max = 1/1/2013
我无法弄清楚如何在一组 ID 中仅识别不间断的类型分组。对于 ID #1,我需要保留两个 'A' 具有单独 min/max 日期的类型,因为它们被类型 'B' 分开,所以我不能只提取所有的最小日期为 ID #1 输入 A,它必须是两个独立的实例。
我试过的是类似于下面两行的内容,但是这两行都没有准确地捕捉到上面提到的 ID #1 中类型 B 中断类型 A 的情况。
Max(Date) OVER (Partition By ID, Type)
or this:
Row_Number() OVER (Partition By ID, Type ORDER BY Date DESC)
,then selecting Row #1 for max date, and date ASC w/ row #1 for min date
感谢您提供的任何见解!
如果我没理解错的话,您希望 id/type 的 min/max 值使用降序日期排序进行分组,但要注意的是您希望它们基于 id 中的时间簇。
您可以做的是使用 CONDITIONAL_CHANGE_EVENT
标记类型更改的行,然后在标准 min/max 聚合的 GROUP BY
中使用它。
这将是实现您想要的目标的中间步骤:
select ID, Type, Date,
CONDITIONAL_CHANGE_EVENT(Type) OVER( PARTITION BY ID ORDER BY Date desc) cce
from mytable
group by ID, Type, Date
order by ID, Date desc, Type
ID Type Date cce
1 A 2015-07-01 00:00:00 0
1 B 2015-01-01 00:00:00 1
1 A 2014-08-05 00:00:00 2
22 B 2015-03-01 00:00:00 0
22 B 2014-09-01 00:00:00 0
333 A 2015-08-01 00:00:00 0
333 B 2015-04-01 00:00:00 1
333 B 2014-03-29 00:00:00 1
333 B 2013-02-28 00:00:00 1
333 C 2013-01-01 00:00:00 2
使用 CCE 将它们分组后,您可以对其进行聚合以获得您要在 cce 上进行分组的 min/max。你可以玩一下底部的顺序,这个顺序对我来说似乎最有意义。
select id, type, min(date), max(date)
from (
select ID, Type, Date,
CONDITIONAL_CHANGE_EVENT(Type) OVER( PARTITION BY ID ORDER BY Date desc) cce
from mytable
group by ID, Type, Date
) x
group by id, type, cce
order by id, 3 desc, 4 desc;
id type min max
1 A 2015-07-01 00:00:00 2015-07-01 00:00:00
1 B 2015-01-01 00:00:00 2015-01-01 00:00:00
1 A 2014-08-05 00:00:00 2014-08-05 00:00:00
22 B 2014-09-01 00:00:00 2015-03-01 00:00:00
333 A 2015-08-01 00:00:00 2015-08-01 00:00:00
333 B 2013-02-28 00:00:00 2015-04-01 00:00:00
333 C 2013-01-01 00:00:00 2013-01-01 00:00:00