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
已经存在,因此可以作为参数提供给其他计算、函数等。
假设有一个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
已经存在,因此可以作为参数提供给其他计算、函数等。