2015-05-20 168 views
2

我正在調用一個存儲過程,該過程返回一個包含兩列,一個ident(整數)和一個分數(float4)的表。整數列將是唯一值。我現在想知道表中有多少行比具有給定值的ident有更大/更小的分數。我正在努力弄清楚如何在SQL中做到這一點。如果它是像PHP一樣的東西,我會按照分數對返回的數據進行排序,例如,找到具有我正在查找的身份的行的索引,然後從總行數中減去該行的索引。在PostgreSQL 9.1.15中,我不知道該怎麼做。根據行值對行進行計數

SELECT COUNT(*) 
FROM my_stored_proc() 
WHERE score > *Score of person with given ident* 
ORDER BY score; 

回答

1

如果你只關心的ident = 2,你可以這樣做:

select sum(case when t.score < t2.score then 1 else 0 end) as LessThan, 
     sum(case when t.score > t2.score then 1 else 0 end) as GreaterThan 
from table t cross join 
    (select t.* from table where ident = 2) t2; 

如果你只是想引用表一次(你會如果訪問它是昂貴的),你可以做以上CTE,或者你可以這樣做:

select sum(case when score < score2 then 1 else 0 end) as LessThan, 
     sum(case when score > score2 then 1 else 0 end) as GreaterThan 
from (select t.*, 
      max(case when ident = 2 then score end) over() as score2 
     from table t 
    ) t 
+0

謝謝!這很好。 – Gargoyle

0

使用窗口功能:

SELECT worse, better 
FROM (
    SELECT 
    ident, 
    COUNT(*) OVER (ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) worse, 
    COUNT(*) OVER (ORDER BY score ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) better, 
    FROM my_stored_proc() 
) t 
WHERE ident = 2; -- replace with the "ident" you care about 

這將簡單地計算在結果集中是高於或當前行下,如果按分數排序的行數。

反正Gordon's解決方案可能會稍微好一點,因爲它考慮到了ident的可能性正在返回不止一次從my_stored_proc(),並採取每ident的最高得分。

+0

這給了我所有人的價值,作爲結果集的一部分。我想根據特定的身份證號碼獲取上方/下方的號碼。 – Gargoyle

+0

@Gargoyle:我不確定我是否理解。你可以請發佈一個預期的輸出示例嗎?我覺得這個查詢是你當前措詞的正確答案...... –

+0

所以我們假設表格返回1,2,3和4,分數分別爲1.0,2.0,3.0和4.0。我現在想知道有多少人比身份證2更好/更差,所以有1分小,2分大。所以你的代碼是給每個人的結果,但我只想要返回值1和2,因爲我只關心ident 2的人。這是否更好地澄清它? – Gargoyle

相關問題