postgresql 尝试对项目进行排名时,row_number错误

xlpyo6sf  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(228)

我正试图回到SQL查询和我有一个令人沮丧的问题。
我尝试获取数据集中的所有项目,并按分区对它们进行排名。我研究了一下,觉得应该是这样的:

select g.ticker, g.sector, g.industry, g.countryname, g.exchange, c.carbon, c.year,
    ROW_NUMBER() OVER (
    PARTITION BY g.sector, g.industry, g.countryname, g.exchange
    ORDER BY c.carbon DESC
    ) AS 'Rank'
from "General" g 
INNER JOIN carbon c ON upper(c.ticker) =g.ticker ;

输出将是分区中每个组的排名,在这种情况下,它将是部门,行业,国家名称和交易所,然后根据其碳排放量对行进行排名。
我得到这个错误:

Error occurred during SQL script execution

Reason:
SQL Error [42601]: ERROR: syntax error at or near "'Rank'"
  Position: 1305

如果我删除rank部分,数据连接并提供结果(显然不是我想要的排名,但我知道基本查询工作)。我做错了什么?
第二个(相关)问题,我忘了我有多讨厌SQL错误消息。上面的错误告诉我有一个语法错误,然后我去了文档,在我的代码和他们的例子中看不到任何不同。假设缺乏经验,是否有更好的方法来获得可操作的错误消息(即在Python中,我得到一个堆栈跟踪,我可以读取它来查看代码的哪一部分出错了)?

jgwigjjp

jgwigjjp1#

不要对列别名使用单引号。另外,我建议避免任何属于标准SQL的内容(它有一个rank()函数)。我经常使用seqnum

select g.ticker, g.sector, g.industry, g.countryname, g.exchange, c.carbon, c.year,
       row_number() over (
           partition by g.sector, g.industry, g.countryname, g.exchange
           order by c.carbon desc
                         ) as seqnum
from "General" g join
     carbon c 
     on upper(c.ticker) = g.ticker ;

注意:字符串和日期常量只能使用单引号。如果要转义列名,请使用双引号(就像查询对表名General所做的那样)。

相关问题