在oracle SQL DB中,相同的主Id多次出现在不同的批次Id中。如何在当前批次Id之前知道批次Id

在oracle SQL DB中,相同的主Id多次出现在不同的批次Id中。如何在当前批次Id之前知道批次Id,oracle,Oracle,我正在研究oracle数据库。 我们将客户数据加载到源表中,最终迁移到目标表。 每次将客户数据加载到源表中时,它都有一个唯一的批处理id。 若我们想更新customer表中的某些字段,那个么我们再次在源表中加载相同的customer,但这次加载的是不同的batch_id。 现在我想在最新批次id之前知道客户的批次id。 我们获取的批次id通常是当前日期。看起来您基本上是在源表中查找第二大值 在此示例代码中,SOURCE\u表表示包含相同的CUSTOMER\u NO和不同的BATCH\u NO的表

我正在研究oracle数据库。 我们将客户数据加载到源表中,最终迁移到目标表。 每次将客户数据加载到源表中时,它都有一个唯一的批处理id。 若我们想更新customer表中的某些字段,那个么我们再次在源表中加载相同的customer,但这次加载的是不同的batch_id。 现在我想在最新批次id之前知道客户的批次id。
我们获取的批次id通常是当前日期。

看起来您基本上是在
源表中查找第二大值

在此示例代码中,
SOURCE\u表
表示包含相同的
CUSTOMER\u NO
和不同的
BATCH\u NO
的表:

create table source_table (customer_no integer, batch_no date);

insert into source_table values ('1', SYSDATE-2);
insert into source_table values ('1', SYSDATE-1);
insert into source_table values ('1', SYSDATE);

SELECT batch_no
FROM (
  SELECT batch_no, row_number() over (order by batch_no desc) as row_num
  FROM source_table
) t
WHERE row_num = 2
其中,row_num=2表示表中的第二大值。
查询返回SYSDATE-1。

使用
行数
分析函数

您的示例数据

select * from tab
order by 1,2

CUSTOMER_ID BATCH_ID           
----------- -------------------
          1 09.12.2019 00:00:00
          1 10.12.2019 00:00:00
          2 10.12.2019 00:00:00
Row\u number
assichns序列号从1开始,每个客户订单从
BATCH\u ID
开始递减-您感兴趣的是最新订单之前的一个,即编号为2的行

with cust as (
select 
customer_id, batch_id,
row_number() over (partition by customer_id order by batch_id desc) rn
from tab)
select CUSTOMER_ID, BATCH_ID
from cust
where rn = 2;

CUSTOMER_ID BATCH_ID           
----------- -------------------
          1 09.12.2019 00:00:00