在 plsql 中查找以下数据中的重叠
Find overlapping in below data in plsql
code Low High
A 0 99
E 0 99
T 0 99
A 100 **199**
E 100 **199**
T 100 **199**
A **199** 299
E **199** 299
T **199** 299
A 300 399
E 300 399
T 300 399
我想检查199之类的重叠,如果重叠则在oracle中抛出异常。
可能会创建一个过程,其游标包含具有 LAG()
分析函数的查询
CREATE OR REPLACE PROCEDURE Pr_Check_Overlap( i_code tab.code%type ) IS
BEGIN
FOR c IN
(
SELECT t.*, LAG(high,1,high) OVER (PARTITION BY code ORDER BY code,low) AS previous_high
FROM tab t
WHERE code=i_code
ORDER BY Low
)
LOOP
DBMS_OUTPUT.PUT_LINE(c.code||' '||c.low||' '||c.high);
IF c.low = c.previous_high THEN
RAISE_APPLICATION_ERROR( -20101, 'First Met Overlapping Value is '||c.low );
END IF;
END LOOP;
END;
/
并为其参数调用可互换的三个值,如下所示
BEGIN
Pr_Check_Overlap('A'); -- 'E', 'T'
END;
您可以使用单个查询来完成,然后通过 IF
条件进行处理。
查询以确定是否应抛出异常:
SELECT MIN(CASE WHEN LAG_HIGH BETWEEN LOW AND HIGH THEN 'EXCEPTION'
ELSE 'NO EXCEPTION'
END) AS RESULT
FROM (SELECT T.*,
LAG(HIGH) OVER(PARTITION BY CODE ORDER BY LOW) AS LAG_HIGH
FROM YOUR_TABLE T);
如果你想要所有引发异常的代码,那么你可以使用以下查询:
SELECT DISTINCT CODES FROM
(SELECT CASE WHEN LAG_HIGH BETWEEN LOW AND HIGH THEN CODE
END AS CODES
FROM (SELECT T.*,
LAG(HIGH) OVER(PARTITION BY CODE ORDER BY LOW) AS LAG_HIGH
FROM YOUR_TABLE T))
WHERE CODES IS NOT NULL;
code Low High
A 0 99
E 0 99
T 0 99
A 100 **199**
E 100 **199**
T 100 **199**
A **199** 299
E **199** 299
T **199** 299
A 300 399
E 300 399
T 300 399
我想检查199之类的重叠,如果重叠则在oracle中抛出异常。
可能会创建一个过程,其游标包含具有 LAG()
分析函数的查询
CREATE OR REPLACE PROCEDURE Pr_Check_Overlap( i_code tab.code%type ) IS
BEGIN
FOR c IN
(
SELECT t.*, LAG(high,1,high) OVER (PARTITION BY code ORDER BY code,low) AS previous_high
FROM tab t
WHERE code=i_code
ORDER BY Low
)
LOOP
DBMS_OUTPUT.PUT_LINE(c.code||' '||c.low||' '||c.high);
IF c.low = c.previous_high THEN
RAISE_APPLICATION_ERROR( -20101, 'First Met Overlapping Value is '||c.low );
END IF;
END LOOP;
END;
/
并为其参数调用可互换的三个值,如下所示
BEGIN
Pr_Check_Overlap('A'); -- 'E', 'T'
END;
您可以使用单个查询来完成,然后通过 IF
条件进行处理。
查询以确定是否应抛出异常:
SELECT MIN(CASE WHEN LAG_HIGH BETWEEN LOW AND HIGH THEN 'EXCEPTION'
ELSE 'NO EXCEPTION'
END) AS RESULT
FROM (SELECT T.*,
LAG(HIGH) OVER(PARTITION BY CODE ORDER BY LOW) AS LAG_HIGH
FROM YOUR_TABLE T);
如果你想要所有引发异常的代码,那么你可以使用以下查询:
SELECT DISTINCT CODES FROM
(SELECT CASE WHEN LAG_HIGH BETWEEN LOW AND HIGH THEN CODE
END AS CODES
FROM (SELECT T.*,
LAG(HIGH) OVER(PARTITION BY CODE ORDER BY LOW) AS LAG_HIGH
FROM YOUR_TABLE T))
WHERE CODES IS NOT NULL;