我试图在另一个组的子组中找到最小和最大日期。这是一个例子'数据'
= '".$_POST["app_id"]."'"); }
我想识别的是 - 在ID中,每个类似类型的块的最小/最大日期是多少?因此,对于ID#333,我想要以下信息:
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分组中仅识别不间断的Type分组。对于ID#1,我需要保留两个' A'具有单独的最小/最大日期的类型,因为它们被类型' B'分开,所以我不能仅为ID#1拉出所有类型A的最小日期,它具有是两个独立的实例。
我尝试过的是类似下面两行的内容,但这两行都没有准确地捕获上面提到的ID#1的情况,其中B类中断了A类。
A: min & max = 8/1/2015
B: min = 2/28/2013
max = 4/1/2015
C: min & max = 1/1/2013
感谢您提供的任何见解!
答案 0 :(得分:1)
如果我理解正确,您希望使用降序日期排序对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