Python 具有Pareto边界的SQL

Python 具有Pareto边界的SQL,python,mysql,sql,Python,Mysql,Sql,表位于照片中 问:太阳能和风能往往是互补的,因为在云层较少的情况下,风力往往较小,而太阳最容易到达太阳能电池板。本部分的目标是确定在太阳能和风能生产之间取得最佳平衡的国家。在这里,如果一个州位于太阳能和风能生产的帕累托前沿,我们将其定义为“最佳”。换句话说,如果没有其他州同时生产更多的太阳能和风能,那么一个州是帕累托最优的,而帕累托前沿是帕累托最优状态的集合。编写一个返回整个帕累托边界的查询。结果应该是形式的三倍(州、太阳能、风能),其中州是边境州的名称,太阳能和风能是其太阳能和风能产量,单位为

表位于照片中

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

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

我只知道怎么做:

SELECT state, solar, wind 
FROM energy 
WHERE solar+wind = (SELECT max(solar+wind) 
                    FROM energy); 
这并不能给出完整的结果

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


一个点
A
属于帕累托边界,当且仅当没有其他点
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是(更改名称以满足您的需要):

从这一点上说,我非常确定订购是直接的

下面是一个小例子:

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
)

我在使用你的代码时出现了这个错误,你知道为什么吗<代码>(sqlite3.OperationalError)靠近“(”:语法错误[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
)