2015-05-20 113 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

相关问题