假设我有一个日期和价格列表:
20170322 109.89
20170321 107.02
20170320 109.25
20170317 108.44
20170316 108.53
20170315 107.94
20170314 106.83
20170313 110.02
20170310 107.31
20170309 107.54
20170308 107.67
20170307 108.98
我需要的是,从最近的日期:20170322(109.89),第一个日期/价格值高于原始值,即20170313(110.02)。请注意,这些是按日期的DESC顺序排列的
一整天都在忙这个。
2条答案
按热度按时间ioekq8ef1#
假设这两个列分别称为DT和PRICE,并且假设只有一个“东西”的价格是您监视的(否则您需要一个GROUP BY子句):
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions056.htm
chhqkbe12#
使用MATCH_RECOGNIZE子句的解决方案(需要Oracle 12及更高版本)。
我在WITH子句中创建了测试数据。这不是解决方案的一部分; SQL查询在WITH子句之后的
SELECT TICKER, ....
处开始PATTERN中的不情愿匹配中的问号会触发JDBC驱动程序,因此无法从SQL Developer运行此查询;它需要在SQL*Plus或类似的前端中运行。(解决方法是将
b*?
更改为b*
,并在DEFINE子句中添加:b as b.price <= a.price
.)为了更好地说明
MATCH_RECOGNIZE
的灵活性,我假设可能有几个“ticker”,每个都有其起始日期(最早的价格日期),查询将查找每个ticker第一次出现的价格高于原始价格的情况。