:)
如何使用LEAD功能将产品与有效期组合?
如果下一个产品/记录与前一个相同,我们将在整个有效期内使用此产品,我如何选择device_id、valid_from、valid_to、product?
DEVICE_ID| VALID_FROM | VALID_TO | PRODUCT
Y0001 01.01.2012 10.01.2012 Y
Y0001 10.01.2012 20.01.2012 Y
Y0001 10.01.2013 20.01.2013 Z
Y0001 21.01.2013 30.01.2013 Y
Y0001 12.02.2013 21.02.2013 X
我希望获得的查询的预期结果如下所示:
仅返回4条记录:(不更改订单)
DEVICE_ID| VALID_FROM | VALID_TO | PRODUCT
Y0001 01.01.2012 20.01.2012 Y -- IF next row was the same row - Y then combine period of validity
Y0001 10.01.2013 20.01.2013 Z
Y0001 21.01.2013 30.01.2013 Y
Y0001 12.02.2013 21.02.2013 X
详情:
**!*!**当下一条记录为同一产品时,则返回一个有效期合并的产品(取第一行的最小valid_from(默认值?)和第二行Y的最大valid_to)
示例:
DEVICE_ID| VALID_FROM | VALID_TO | PRODUCT | NEXT_ROW
Y0001 01.01.2012 10.01.2012 Y Y
Y0001 10.01.2012 20.01.2012 Y Z -- NOT Y
Y0001 10.01.2013 20.01.2013 Z 0
型
结果:
DEVICE_ID| VALID_FROM | VALID_TO | PRODUCT | NEXT_ROW
Y0001 01.01.2012 20.01.2012 Y Z
Y0001 10.01.2013 20.01.2013 Z 0
现在我有启动代码:
Select device_id
,valid_from
,valid_to
,LEAD(product,1,0) OVER (order by 1) as next_row
from test
它返回:
DEVICE_ID| VALID_FROM | VALID_TO | PRODUCT | NEXT_ROW
Y0001 01.01.2012 10.01.2012 Y Y
Y0001 10.01.2012 20.01.2012 Y Z
Y0001 10.01.2013 20.01.2013 Z Y
Y0001 21.01.2013 30.01.2013 Y X
Y0001 12.02.2013 21.02.2013 X 0
有没有办法使用子查询或其他方法来返回像我之前展示的那样的结果?
3条答案
按热度按时间k4emjkb11#
您需要一组子查询来生成所需的结果-
演示。
yr9zkbsy2#
对我来说,它看起来不像一个
LEAD
,而是一种 * 差距和岛屿 * 问题。样本数据:
查询从这里开始,首先查找数据组(
grp
列):最后,获取每个器械、产品和组的最小和最大日期值:
型
6tqwzwtp3#
从Oracle 12开始,您可以使用
MATCH_RECOGNIZE
简单高效地解决逐行模式匹配问题:其中,对于示例数据:
输出:
| 器械ID|有效_自|有效期至|产品|
| - ------|- ------|- ------|- ------|
| Y0001| 2012年01月01日00时00分|2012年1月20日上午00时00分|是|
| Y0001| 2013年1月10日上午00时00分|2013年1月20日上午00时00分|Z型|
| Y0001| 2013年1月21日上午00时00分|2013年1月30日上午00时00分|是|
| Y0001| 2013年2月12日00:00:00| 2013年2月21日上午00时00分|十|
fiddle