基于“状态”及其时间顺序构建SQL查询以精确定位堆栈中的记录
我试图找出如何构建一个查询,该查询将只返回1到多个事务记录(按一个序列号分组)中的2个事务记录。我需要的两个记录是: 1堆栈中状态为“错误”的最新事务,以及 2该堆栈中具有成功状态的下一个最新事务 因此,一组记录的示例可能如下所示基于“状态”及其时间顺序构建SQL查询以精确定位堆栈中的记录,sql,oracle,Sql,Oracle,我试图找出如何构建一个查询,该查询将只返回1到多个事务记录(按一个序列号分组)中的2个事务记录。我需要的两个记录是: 1堆栈中状态为“错误”的最新事务,以及 2该堆栈中具有成功状态的下一个最新事务 因此,一组记录的示例可能如下所示 1) SERIAL_NUMBER TRXN_ID STATUS ------------- --------- -------- 1 08LKL47T8ZF6 16379796 Success 2 08LKL47T8Z
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感谢您的回复。我对工会没有多少经验。你有没有可能提出一个理论上的例子?