我有一个用户输入表。我想计算每个用户的输入数量,根据计数排序,然后找到行号。
换句话说,我想根据输入的数量找到每个用户的等级。
该数据库位于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
你可以尝试下面 - 只需使用子查询
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'
您可以将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
子句之后应用。