按组分隔的SQL查询 请考虑下面的表格

按组分隔的SQL查询 请考虑下面的表格,sql,sql-server,tsql,Sql,Sql Server,Tsql,ProductCodeFlagDate--------------------- AN01/10/2015 AN02/10/2015 2015年10月4日 2015年10月5日 2015年10月12日 AN13/10/2015 2015年10月15日 2015年10月16日 2015年10月16日 2015年10月17日 BN01/12/2015 BN02/12/2015 2015年12月8日前 BN08/12/2015 BN09/12/2015 下面的SQL查询可以为我提供什么结果Produc

ProductCodeFlagDate--------------------- AN01/10/2015 AN02/10/2015 2015年10月4日 2015年10月5日 2015年10月12日 AN13/10/2015 2015年10月15日 2015年10月16日 2015年10月16日 2015年10月17日 BN01/12/2015 BN02/12/2015 2015年12月8日前 BN08/12/2015 BN09/12/2015 下面的SQL查询可以为我提供什么结果ProductCodeFlagStartDateEnd日期---------------------------------- AN01/10/201502/10/2015 2015年10月4日512/10/2015 AN13/10/201515/10/2015 2015年10月16日201517/10/2015BN01/12/201502/12
到201508/12/201508/12/2015BN08/12/201509/12/2015谢谢。

这里的关键是为每个产品的连续N和Y标志分配组。此后,它只是对分类组的分组操作

with grps as (    
 select t.*,
-row_number() over(partition by productcode,flag order by dt) 
+ row_number() over(partition by productcode order by dt) grp
from t
) 
select productcode,flag,min(dt) startdate,max(dt) enddate 
from grps
group by productcode,flag,grp
order by 1,3

这里的关键是将组分配给每个产品的连续N和Y标志。此后,它只是对分类组的分组操作

with grps as (    
 select t.*,
-row_number() over(partition by productcode,flag order by dt) 
+ row_number() over(partition by productcode order by dt) grp
from t
) 
select productcode,flag,min(dt) startdate,max(dt) enddate 
from grps
group by productcode,flag,grp
order by 1,3

我可能错了,但我认为没有一条SQL语句能够做到这一点。它并不是简单地按一个事物分组,而是你似乎想根据之前发生的事情/接下来发生的事情对它们进行分组。如果它仅仅是ProductCode和Flag的组合,那么在date字段中使用MIN、MAX和GROUP BY可以很容易地实现。但在这种情况下,这不会有帮助。按标志分组和行号的差异将起作用。e、 g.按日期排列的订单上的行数-按日期排列的分区上的行数。然后您只需要每个组的最小/最大值。谢谢ZLK,您的解决方案类似于vkp。我可能错了,但我认为没有SQL语句可以单独做到这一点。它并不是简单地按一个事物分组,而是你似乎想根据之前发生的事情/接下来发生的事情对它们进行分组。如果它仅仅是ProductCode和Flag的组合,那么在date字段中使用MIN、MAX和GROUP BY可以很容易地实现。但在这种情况下,这不会有帮助。按标志分组和行号的差异将起作用。e、 g.按日期排列的订单上的行数-按日期排列的分区上的行数。然后你只需要每个组的最小值/最大值。谢谢ZLK,你的解决方案与vkp类似。谢谢vkp,我刚刚意识到这个问题被称为间隙和孤岛。谢谢vkp,我刚刚意识到这个问题被称为间隙和孤岛。