PL/SQL не является обязательным условием для поиска данных, разделяющих один атрибут, но имеющих последовательные значения для другого атрибута.
Используя общую структуру таблицы, мы найдем любую пару транзакций, совместно использующую те же BIZ_DATE и AMT, с соседними идентификаторами TRANS_ID.
После создания и загрузки таблицы:
CREATE TABLE MY_TABLE (
BIZ_DATE DATE NOT NULL,
NAME VARCHAR2(200) NOT NULL,
AMT NUMBER NOT NULL,
TRANS_ID NUMBER NOT NULL );
INSERT INTO MY_TABLE
(BIZ_DATE, NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-MAY-2015', 'DD-MON-YYYY'), 'BOB', 8086, 159);
INSERT INTO MY_TABLE
(BIZ_DATE, NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-MAY-2015', 'DD-MON-YYYY'), 'BOB', 8085, 159);
INSERT INTO MY_TABLE
(BIZ_DATE, NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-MAY-2015', 'DD-MON-YYYY'), 'BOB', 9088, 159);
INSERT INTO MY_TABLE
(BIZ_DATE, NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-MAY-2015', 'DD-MON-YYYY'), 'BOB', 9087, 159);
INSERT INTO MY_TABLE
(BIZ_DATE, NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-MAY-2015', 'DD-MON-YYYY'), 'BOB', 1111, 159);
INSERT INTO MY_TABLE
(BIZ_DATE, NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-APR-2015', 'DD-MON-YYYY'),'BOB', 5903, 159);
INSERT INTO MY_TABLE
(BIZ_DATE,NAME, TRANS_ID, AMT)
VALUES (TO_DATE('17-MAR-2015', 'DD-MON-YYYY'),'BOB', 5904, 160);
можно сравнить соседние значения с помощью аналитических функций:
SELECT
BIZ_DATE,
AMT,
TRANS_ID,
PRIOR_TRANS_ID
FROM
(SELECT
BIZ_DATE,
AMT,
TRANS_ID,
LAG(TRANS_ID, 1, TRANS_ID)
OVER (PARTITION BY BIZ_DATE, AMT
ORDER BY TRANS_ID ASC)
AS PRIOR_TRANS_ID
FROM MY_TABLE
WHERE BIZ_DATE = TO_DATE('17-MAY-2015', 'DD-MON-YYYY'))
WHERE (TRANS_ID - PRIOR_TRANS_ID) = 1;
Результат:
BIZ_DATE AMT TRANS_ID PRIOR_TRANS_ID
2015-05-17 159 8086 8085
2015-05-17 159 9088 9087
Почему вы хотите хранимую процедуру? –
Erm ... чтобы быстро найти дубликаты, которые вызывают проблемы, без особых усилий. Есть лучший способ сделать это? – user2544542
Я считаю, что есть другие способы сбора таких данных. Я разместил ниже подход, отличный от plsql. Спасибо – alexgibbs