根据行值计算行数
Count rows based on row value
我正在调用一个 returns 具有两列的 table 存储过程,一个标识(整数)和一个分数(float4)。整数列将是唯一值。我现在想知道 table 中有多少行的 larger/smaller 分数比具有给定值的标识要高。我正在努力弄清楚如何在 SQL 中做到这一点。例如,如果它类似于 PHP,我会按分数对返回的数据进行排序,找到具有我要查找的标识的行的索引,然后从总行数中减去它。在 PostgreSQL 9.1.15 中,我不知道该怎么做。
SELECT COUNT(*)
FROM my_stored_proc()
WHERE score > *Score of person with given ident*
ORDER BY score;
使用window个函数:
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
的最高分。
如果你只关心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;
如果您只想引用 table 一次(如果访问它很昂贵,您会这样做),您可以使用 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
我正在调用一个 returns 具有两列的 table 存储过程,一个标识(整数)和一个分数(float4)。整数列将是唯一值。我现在想知道 table 中有多少行的 larger/smaller 分数比具有给定值的标识要高。我正在努力弄清楚如何在 SQL 中做到这一点。例如,如果它类似于 PHP,我会按分数对返回的数据进行排序,找到具有我要查找的标识的行的索引,然后从总行数中减去它。在 PostgreSQL 9.1.15 中,我不知道该怎么做。
SELECT COUNT(*)
FROM my_stored_proc()
WHERE score > *Score of person with given ident*
ORDER BY score;
使用window个函数:
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
的最高分。
如果你只关心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;
如果您只想引用 table 一次(如果访问它很昂贵,您会这样做),您可以使用 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