我的问题在自然语言中有明确说明,但我无法在(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