2016-04-29 134 views
1

让我们假设有一个表'items'有三列:'id','pos'和'neg',选择的结果应该按操作结果pos - neg排序。Postgres:如何根据操作结果排序时获取行号?

所以,以下是这样运作的:

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

现在我需要获取特定的行(表)的位置排序的“差异”的结果。我试过这个:

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 

但是执行返回ERROR:column“diff”不存在。

那么,有可能获得这个位置,或者将差异保存在一个单独的列中会更好吗?

+0

DIFF是别名尝试'ROW_NUMBER()OVER(ORDER BY我.pos - i.neg)AS位置代替 –

+0

@Richard有效!谢谢! – aspermag

回答

0

尝试:

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 
+0

工作,谢谢!不知何故,我甚至没有想到它,因为实际上我有比'pos - neg'更复杂的计算... – aspermag

1

为了避免重复计算,只需移动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存在,并且因此可以作为参数来其他计算,函数被供给的时间等

+0

谢谢!但我忘了说,我需要在整个表格内的一排的位置,而不是选择... – aspermag

+0

同样的方法,有三个层次的嵌套查询。最内部计算diff,下一级计算位置,下一级应用where子句。这很昂贵,但整个桌子需要计算和排序... – MatBailie

相关问题