繁体   English   中英

从由一列定义的组中选择最小值/最大值作为另一列的子组 - SQL,HPVertica

[英]Select min/max from group defined by one column as subgroup of another - SQL, HPVertica

我正在尝试在另一个组的子组中找到最小和最大日期。 这是'数据'的例子

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中,每个类似类型的块的最小/最大日期是多少? 所以对于ID#333,我想要以下信息:

A: min & max = 8/1/2015
B: min = 2/28/2013
   max = 4/1/2015
C: min & max = 1/1/2013

我无法确定如何在ID分组中仅识别不间断的Type分组。 对于ID#1,我需要保持两个'A'类型具有单独的最小/最大日期,因为它们被类型'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 /类型的最小/最大值进行分组,但是捕获的是您希望它们基于id在时间内的簇。

你可以做的是使用CONDITIONAL_CHANGE_EVENT来标记类型更改时的行,然后在标准的最小/最大聚合中使用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上寻找分组的最小值/最大值。 你可以在底部玩这个订单,这个顺序似乎对我来说最有意义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM