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

标签 sql postgresql postgresql-8.4

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

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

数据库采用 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

最佳答案

您可以直接在基本查询中将 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子句。

关于sql - 查找用户在排序表中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334572/

相关文章:

sql - A left outer join B 如何返回比 A 中更多的行?

postgresql - 如何保存 pgAdmin 4 中的更改

java - 手动运行 KTR 和通过 java 运行 KTR 的区别

sql - 如何翻译 Postgresql 9.3 查询以在 Postgresql 8.4 上使用?

postgresql - 从 PostgreSQL 中的 TRIGGER 返回错误消息

sql - HIVE从子查询创建表

c# - 将数据集插入到 SQL 表中

sql - 在父表和子表之间引入一个新表

ruby-on-rails - Ruby on Rails-使用现有模式将UUID实现为主键

sql - PostgreSQL 列 'foo' 不存在