基于“状态”及其时间顺序构建SQL查询以精确定位堆栈中的记录

基于“状态”及其时间顺序构建SQL查询以精确定位堆栈中的记录,sql,oracle,Sql,Oracle,我试图找出如何构建一个查询,该查询将只返回1到多个事务记录(按一个序列号分组)中的2个事务记录。我需要的两个记录是: 1堆栈中状态为“错误”的最新事务,以及 2该堆栈中具有成功状态的下一个最新事务 因此,一组记录的示例可能如下所示 1) SERIAL_NUMBER TRXN_ID STATUS ------------- --------- -------- 1 08LKL47T8ZF6 16379796 Success 2 08LKL47T8Z

我试图找出如何构建一个查询,该查询将只返回1到多个事务记录(按一个序列号分组)中的2个事务记录。我需要的两个记录是:

1堆栈中状态为“错误”的最新事务,以及 2该堆栈中具有成功状态的下一个最新事务

因此,一组记录的示例可能如下所示

1)  SERIAL_NUMBER   TRXN_ID     STATUS
    -------------   ---------   --------
1   08LKL47T8ZF6    16379796    Success
2   08LKL47T8ZF6    16380200    Error
3   08LKL47T8ZF6    16381077    Retired
4   08LKL47T8ZF6    16581500    Success
5   08LKL47T8ZF6    16581833    Success
6   08LKL47T8ZF6    16382800    Retired
7   08LKL47T8ZF6    16583505    Error
8   08LKL47T8ZF6    16586413    Error
到目前为止,我有以下几点。。。但这将返回上面列出的所有8条记录

SELECT 
         STG.src_serial_number 
        ,STG.trxn_id
        ,STG.interface_status
  FROM 
       staging_table STG 

       -- All SN's where the most recent(max) transaction was an ERROR.
       ,(  SELECT X.src_serial_number
             FROM staging_table X  
                  ,(  SELECT MAXNUM.src_serial_number, max(MAXNUM.trxn_id) as trxn_id
                        FROM staging_table MAXNUM  
                       WHERE MAXNUM.src_serial_number = src_serial_number
                    GROUP BY MAXNUM.src_serial_number ) Y
            WHERE X.src_serial_number = Y.src_serial_number
              AND X.trxn_id = Y.trxn_id
              AND X.interface_status = 'Error'
        ) ERROR_REC

       -- No prior TRXN_ID / trxn for this Serial Number stack is a SUCCESS.
       ,(  SELECT PRIORSUCCESS.src_serial_number
             FROM staging_table PRIORSUCCESS
            WHERE PRIORSUCCESS.interface_status = 'Success' 
              AND PRIORSUCCESS.src_serial_number = src_serial_number
        ) SUCCESS_REC

 WHERE STG.src_serial_number = ERROR_REC.src_serial_number
   AND STG.src_serial_number = SUCCESS_REC.src_serial_number
   AND ERROR_REC.src_serial_number = SUCCESS_REC.src_serial_number

ORDER BY  STG.src_serial_number asc, STG.trxn_id asc
预期的结果将是构建一个只返回记录8最新错误和记录5最新成功的查询

    SERIAL_NUMBER   TRXN_ID     STATUS
    -------------   ---------   --------
5   08LKL47T8ZF6    16581833    Success
8   08LKL47T8ZF6    16586413    Error

不太漂亮,但是-会有帮助吗?如果数据集很大,可能不会太快,请记住,从同一个表中提取3次

SQL> with test (rn, serial, trxn_id, status) as
  2  (
  3  select 1,   '08LKL47T8ZF6',    16379796,    'Success' from dual union all
  4  select 2,   '08LKL47T8ZF6',    16380200,    'Error'   from dual union all
  5  select 3,   '08LKL47T8ZF6',    16381077,    'Retired' from dual union all
  6  select 4,   '08LKL47T8ZF6',    16581500,    'Success' from dual union all
  7  select 5,   '08LKL47T8ZF6',    16581833,    'Success' from dual union all
  8  select 6,   '08LKL47T8ZF6',    16382800,    'Retired' from dual union all
  9  select 7,   '08LKL47T8ZF6',    16583505,    'Error'   from dual union all
 10  select 8,   '08LKL47T8ZF6',    16586413,    'Error'   from dual
 11  )
 12  select * from test
 13  where trxn_id = (select max(trxn_id) from test
 14                   where status = 'Error'
 15                  )
 16     or trxn_id = (select max(trxn_id) from test
 17                   where status = 'Success'
 18                     and trxn_id < (select max(trxn_id) from test
 19                                    where status = 'Error'
 20                                   )
 21                  );

        RN SERIAL          TRXN_ID STATUS
---------- ------------ ---------- -------
         5 08LKL47T8ZF6   16581833 Success
         8 08LKL47T8ZF6   16586413 Error

SQL>

感谢到目前为止的反馈@LittleFoot,我认为上述解决方案不现实,除非我理解错误。我需要从STAGING_表中提取数据的表有950万行,并且每天都在增长。合并每一行数据是不可能的。这是我到目前为止建立的,但它太慢了

  SELECT STG_SUB.src_serial_number
    FROM staging_table STG_SUB
   WHERE STG_SUB.interface_status = 'Error'
     AND STG_SUB.record_id = ( SELECT MAX(MAX_TRXN.record_id)
                                 FROM staging_table MAX_TRXN
                                WHERE MAX_TRXN.src_serial_number = STG_SUB.src_serial_number )
UNION
  SELECT STG_SUB.src_serial_number
    FROM staging_table STG_SUB
   WHERE STG_SUB.record_id = ( SELECT MAX(MAX_TRXN.record_id)
                                 FROM staging_table MAX_TRXN
                                WHERE MAX_TRXN.src_serial_number = STG_SUB.src_serial_number
                                  AND MAX_TRXN.interface_status = 'Success'
MINUS
  SELECT STG_SUB.src_serial_number
    FROM staging_table STG_SUB
   WHERE STG_SUB.interface_status <> 'Error'
     AND STG_SUB.record_id = ( SELECT MAX(MAX_TRXN.record_id)
                                 FROM staging_table MAX_TRXN
                                WHERE MAX_TRXN.src_serial_number = STG_SUB.src_serial_number )
ORDER BY 1

工会可能会将此设置为非常简单的最大/最小和限制1感谢您的回复。我对工会没有多少经验。你有没有可能提出一个理论上的例子?