我对Oracle SQL有疑问,我必须根据日期范围选择最早的记录。我订了A桌
| 符号运行日期|客户编号|客户端_状态|
| - -----|- -----|- -----|
| 2023 - 03 - 31 - 2023 - 2023 - 03 - 31 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 202| 00019872| 2|
| 2023 - 03 - 30 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023 - 2023| 00019872| 2|
| 2023 - 03 - 29| 00019872| 2|
| 2023 - 03 - 28 2023 - 03 - 28 2023 - 03 - 28| 00019872| 2|
| 2023 - 03 - 27 2023 - 03 - 27| 00019872| 1|
| 2023 - 03 - 26 2023 - 03 - 26| 00019872| 1|
| 2023 - 03 - 25 2023 - 03 - 25 2023 - 03 - 25| 00019872| 1|
| 2023 - 03 - 24 2023 - 03 - 24| 00019872| 2|
| 2023 - 03 - 23 - 2023 - 03 - 23| 00019872| 2|
| 2023 - 03 - 22 2023 - 03 - 22 2023 - 03 - 22| 00019872| 2|
| 2023 - 03 - 21 2023 - 03 - 21 2023 - 03 - 21| 00019872| 2|
| 2023 - 03 - 20 2023 - 03 - 20 2023 - 03 - 20| 00019872| 2|
| 2023 - 03 - 19 2023 - 03 - 19 2023 - 03 - 19| 00019872| 2|
| 2023 - 03 - 18 2023 - 03 - 18 2023 - 03 - 18| 00019872| 1|
| 2023 - 03 - 17| 00019872| 1|
| 2023 - 03 - 16 2023 - 03 - 16 2023 - 03 - 16| 00019872| 1|
我的结果输出应该是(CLIENT_STATUS = 2)
| 符号运行日期|客户编号|客户端_状态|
| - -----|- -----|- -----|
| 2023 - 03 - 28 2023 - 03 - 28 2023 - 03 - 28| 00019872| 2|
请让我知道它如何可以实现在oracle sql
3条答案
按热度按时间r6hnlfcb1#
如果你想要最早的一行包含最新的
client_status
,那么使用MATCH_RECOGNIZE
来执行逐行处理:或者,使用解析函数:
其中,对于样本数据:
两个输出:
| 符号运行日期|客户编号|客户端_状态|
| - -----|- -----|- -----|
| 2019 -03-28 00:00:00| 00019872| 2|
fiddle
ef1yzkbh2#
我不是特别喜欢这种方法,但-目前,不能想出更好的办法。
样本数据:
temp
CTE查找每个客户端的最高日期,状态= 1,而主查询返回日期大于CTE返回的日期且状态= 2的行。wgeznvg73#
一个方便的方法是使用
row_number()
来获得一个与最小日期和日期范围相匹配的单行,例如:在这里,row_number()函数从最早日期的1开始,并对后续的每一行递增1。在外部查询中,我们只要求生成rn为1的行。请注意,
order by
确定如何生成行编号序列。升序使最早的日期成为第1行,而降序将使最近的日期成为第1行。同样,如果有多个行具有相同的最早日期,则此方法仍将仅返回1行。