在已排序 table 中查找用户的位置
Find position of user in a sorted table
我有一个带有用户输入的 table。我想计算每个用户的输入数量,根据计数排序,然后找到行号。
换句话说,我想根据输入的数量找到每个用户的排名。
数据库是 PostgreSQL 8.4。似乎没有任何性能问题。 table 的行数少于 1 000 000。
这是重复的
this 问题。
可悲的是,这个问题的分数是 -3,没有答案。
table 被命名为 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 select 来自 table 的一行?我试过这个:
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_number1
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
在 window 函数之前计算。您也可以将其写为 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
子句将结果限制为一行,并且 window 函数在 之后应用where
子句。
我有一个带有用户输入的 table。我想计算每个用户的输入数量,根据计数排序,然后找到行号。
换句话说,我想根据输入的数量找到每个用户的排名。
数据库是 PostgreSQL 8.4。似乎没有任何性能问题。 table 的行数少于 1 000 000。
这是重复的 this 问题。 可悲的是,这个问题的分数是 -3,没有答案。
table 被命名为 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 select 来自 table 的一行?我试过这个:
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_number1
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
在 window 函数之前计算。您也可以将其写为 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
子句将结果限制为一行,并且 window 函数在 之后应用where
子句。