我的問題在自然語言中有明確說明,但我無法在(ORACLE)SQL中找到解決方案。刪除重量超過限制的行,直到沒有這樣的行
數據具有VALUE(正數)和LIMIT(0到1之間的值表示百分比)列。其任務是刪除(或識別)VALUE大於其餘行的VALUES總和的LIMIT%的行。另一個公式:刪除重量(由VALUE定義)大於總量的LIMIT的行。
請注意,刪除某些行後,總和會減少,因此另一行可能會失敗並需要刪除。
到目前爲止,我嘗試瞭解析函數(請參閱下面的示例),遞歸與連接。一切都沒有成功。
該解決方案應該在沒有PL/SQL的SQL中。如果共識是沒有這樣的解決方案存在,那麼程序就沒問題。
我的錯誤的解決方法使用分析功能如下:
WITH
DATA as (
SELECT 23 as KEY, 100 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 22 as KEY, 101 as VALUE, 0.05 as LIMIT from DUAL
UNION ALL
SELECT 21 as KEY, 10 as VALUE, 0.05 as LIMIT from DUAL
UNION ALL
SELECT 20 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 19 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 18 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 17 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 16 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 15 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 14 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 13 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 12 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 11 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 10 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 9 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 8 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 7 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 6 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 5 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 4 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 3 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 2 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
UNION ALL
SELECT 1 as KEY, 1 as VALUE, 0.15 as LIMIT from DUAL
),
REMOVED AS (
SELECT
d.*,
CASE
WHEN d.VALUE >= d.LIMIT * (SUM(d.VALUE) OVER()) THEN 'N'
ELSE 'Y'
END as FLAG,
d.VALUE/d.LIMIT * (SUM(d.VALUE) OVER()) AS ACT_WEIGHT,
SUM(d.VALUE) OVER() AS TOTOAL_SUM
FROM DATA d
)
SELECT r.KEY
FROM REMOVED r
WHERE FLAG='N';
-- Wrong: KEY=21 is missing!
嗨,這個過程應該是什麼順序?你需要指定。也嘗試使用滯後和領先的窗口函數,那些可以掃描剩餘的行。 – PeterRing