SQL与Pareto Frontier

时间:2017-03-17 13:34:40

标签: python mysql sql

表格位于照片

问题:太阳能和风能往往是互补的,因为当云层很少而太阳能最好地到达太阳能电池板时,它的风很大。我们在这一部分的目标是确定在太阳能和风能生产之间取得最佳平衡的国家。如果它存在于太阳能和风能生产的帕累托前沿,我们将这个州定义为“最佳”。换句话说,如果没有其他国家产生更多的太阳能和更多的风能,那么状态就是帕累托最优,而帕累托边界是帕累托最优的状态集。编写一个返回整个Pareto边界的查询。结果应该是形式的三倍(州,太阳能,风),其中州是边境州的名称,太阳能和风是其太阳能和风能产量,以兆瓦时为单位。按兆瓦时太阳能和风能产量的总和按降序排列结果。

请向我解释帕累托前沿以及如何在sql中应用它。

我只知道如何做到这一点:

SELECT state, solar, wind 
FROM energy 
WHERE solar+wind = (SELECT max(solar+wind) 
                    FROM energy); 

没有给出完整的结果 enter image description here

2 个答案:

答案 0 :(得分:0)

  

看起来很简单,在这种情况下我们可以使用RANK()函数来查找结果。我们也许可以像你一样使用MAX()函数,但会使你的查询变得非常缓慢和复杂。检查此查询,它应该让您的生活变得轻松。

SELECT state, solar, wind, RANK() OVER(partition by state order by (solar+wind) desc) AS rank
FROM energy 

答案 1 :(得分:0)

a属于Pareto Frontier,当且仅当没有其他点b

b.wind >= a.wind AND b.solar >= a.solar AND ... 
AND (b.wind > a.wind OR b.solar > a.solar OR ...)

这些条件可以一起改写为:

b.wind >= a.wind AND b.solar >= a.solar AND ... 
    AND (b.wind + b.solar + ... > a.wind + a.solar + ...)

所以SQL是(更改名称以满足您的需要):

SELECT * FROM states a 
    WHERE NOT EXISTS (
        SELECT * FROM states b 
        WHERE b.wind >= a.wind AND b.solar >= a.solar 
        AND b.wind + b.solar > a.wind + a.solar
    )

我很确定从这一点开始,订购很简单。

这是一个小例子:

create table states (stateid int, wind double, solar double, primary key (stateid))

truncate table states;

insert into states values (1, 100, 30), (2, 120, 50), (3, 150, 30), (4, 100, 60), (5, 150, 40);

select * from states a 
where not exists (
    select * from states b 
    where b.wind >= a.wind and b.solar >= a.solar and b.wind + b.solar > a.wind + a.solar
)