在排序表中查找用户的位置

问题描述 投票:2回答:2

我有一个用户输入表。我想计算每个用户的输入数量,根据计数排序,然后找到行号。

换句话说,我想根据输入的数量找到每个用户的等级。

该数据库位于PostgreSQL 8.4中。似乎没有任何性能问题。该表的行数少于1 000 000。

这是一个重复的this问题。可悲的是,这个问题有-3分,没有答案。

该表名为table1,user_name列具有唯一用户。

user_name   | input
name1         txt input 1
name2         txt input 2
name1         txt input 3
name3         txt input 4
name1         txt input 5
name2         txt input 6

我想要的查询是一个额外的功能:

WITH temp_table AS ( 
    SELECT user_name, COUNT(*) 
    FROM table1 
    GROUP BY user_name 
    ORDER by count DESC ) 
SELECT name, row_number() OVER ( ) FROM temp_table;

输出:

user_name   | row_number
name1         1
name2         2
name3         3

如何使用user_name从该表中选择一行?我试过这个:

WITH temp_table AS ( 
    SELECT user_name, COUNT(*) 
    FROM table1 
    GROUP BY user_name 
    ORDER by count DESC ) 
SELECT name, row_number() OVER ( ) FROM temp_table
WHERE user_name = 'name2';

输出始终为row_number 1

user_name   | row_number
name2         1

我期望

user_name   | row_number
name2         2
sql postgresql postgresql-8.4
2个回答
1
投票

你可以尝试下面 - 只需使用子查询

WITH temp_table AS ( 
    SELECT user_name, COUNT(*) 
    FROM table1 
    GROUP BY user_name 
    ORDER by count DESC 
) 
select * from 
(
SELECT name, row_number() OVER (order by null) FROM temp_table
)A where name='name2'

3
投票

您可以将row_number()group by直接组合到您的基本查询中。

select *
from (
   select user_name, 
          count(*) as cnt,
          row_number() over (order by count(*) desc) as rn
   from table1
   group by user_name
) t
where user_name = 'name2';  

这是因为在窗口函数之前评估group by。您也可以将其写为CTE:

with temp_table as (
   select user_name, 
          count(*) as cnt,
          row_number() over (order by count(*) desc) as rn
   from table1
   group by user_name
)
select *
from temp_table
where user_name = 'name2';

你的row_number()不起作用,因为你的where子句将结果限制为一行,窗口函数在where子句之后应用。

© www.soinside.com 2019 - 2024. All rights reserved.