假设我有一个像下面这样的表:
id | start_value | end_value | date
1 null null 05-APR-23
1 null 5 09-APR-23
1 5 null 15-APR-23
1 null 8 16-APR-23
2 1 null 05-APR-23
2 null 9 09-APR-23
2 9 null 13-APR-23
2 null -1 16-APR-23.
我想查询最新的非空开始和结束值的id如下?我使用的是Oracle数据库。
id | start_value | end_value | start_date | end_date
1 5 8 15-APR-23 16-APR-23
2 9 -1 13-APR-23 16-APR-23
3条答案
按热度按时间uttx8gqw1#
您可以将
LAST_VALUE
解析函数与IGNORE NULLS
选项一起使用,然后过滤以仅包括最近的行:其中,对于样本数据:
输出:
| ID|开始值|END_VALUE|开始日期|结束日期|
| --------------|--------------|--------------|--------------|--------------|
| 1|五|八|2019 -04-15 00:00:00|2019 -04-16 00:00:00|
| 二|九|-1|2019 -04-13 00:00:00|2019 -04-16 00:00:00|
fiddle
mzsu5hc02#
有很多可能性,使用last_value(),使用row_number()两次,然后按id和max分组,例如,为每个id取last no empty“start row”,并将其与last no empty“end row”连接:
dbfiddle
iszxjhcz3#
其中一个选项是使用LEAD()和LAG()分析函数,如下所示: