Найти позицию пользователя в отсортированной таблице - PullRequest
2 голосов
/ 25 марта 2019

У меня есть таблица с пользовательским вводом.Я хочу посчитать количество входов на пользователя, отсортировать их по количеству и затем найти номер строки.

Другими словами, я хочу найти ранг каждого пользователя на основе количества входов.

База данных находится в PostgreSQL 8.4.Кажется, не возникает никаких проблем с производительностью.Таблица содержит менее 1 000 000 строк.

Это дубликат этого вопроса.К сожалению, этот вопрос имеет -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;

OUtput:

user_name   | row_number
name1         1
name2         2
name3         3

Как выбрать строку из этой таблицы, используяИмя пользователя?Я попробовал это:

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';

Выход всегда номер строки 1

user_name   | row_number
name2         1

Я ожидал

user_name   | row_number
name2         2

Ответы [ 2 ]

3 голосов
/ 25 марта 2019

Вы можете объединить 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.

1 голос
/ 25 марта 2019

вы можете попробовать ниже - просто используйте подзапрос

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'
...