Postgres:按操作结果排序时如何获取行号?

Postgres: How to get row number when ordered by the result of operation?

假设有一个table个'items'有'id'、'pos'和'neg'三列,选择的结果应该按照操作的结果排序pos - neg.

因此,以下应该有效:

SELECT
    id,
    pos - neg AS diff
FROM items
ORDER BY diff DESC

现在我需要获取特定行(在 table 中)的位置,按 'diff' 对结果进行排序。我试过这个:

WITH summary AS (
    SELECT
        i.id,
        i.pos - i.neg AS diff,
        ROW_NUMBER() OVER(ORDER BY diff) AS position
    FROM items i)
SELECT s.*  FROM summary s WHERE s.id = 351435254

但执行 returns 错误:列 "diff" 不存在。

所以,是否可以获取位置,或者将差异保留在单独的列中会更好?

尝试:

WITH summary AS (
    SELECT
        i.id,
        i.pos - i.neg AS diff,
        ROW_NUMBER() OVER(ORDER BY (i.pos - i.neg)) AS position
    FROM items i)
SELECT s.*  FROM summary s WHERE s.id = 351435254

为避免重复计算,只需将ROW_NUMBER()移动到外部查询...

WITH summary AS (
    SELECT
        i.id,
        i.pos - i.neg AS diff       
    FROM
        items i
)
SELECT
    s.*,
    ROW_NUMBER() OVER(ORDER BY s.diff) AS position
FROM
    summary s
WHERE
    s.id = 351435254

在内部查询期间,对 diff 的引用将被限制在 之前 SELECT 的范围内,否则你会得到循环引用。

到外部查询时,您的新字段 diff 已经存在,因此可以作为参数提供给其他计算、函数等。