красное смещение: как найти row_number после группировки и агрегирования? - PullRequest
0 голосов
/ 23 сентября 2019

Предположим, у меня есть таблица покупок клиентов ("my_table"), подобная этой:

--------------------------------------
customerid | date_of_purchase | price
-----------|------------------|-------
     1     |  2019-09-20      | 20.23
     2     |  2019-09-21      | 1.99
     1     |  2019-09-21      | 123.34
 ...

Я бы хотел найти n-го покупателя с самыми высокими расходами в этой таблице (скажем, n = 5).Итак, я попробовал это:

with cte as (
  select customerid, sum(price) as total_pay, 
    row_number() over (partition by customerid order by total_pay desc) as rn 
 from my_table group by customerid order by total_pay desc)
select * from cte where rn = 5;

Но это дает мне бессмысленные результаты.По некоторым причинам rn не кажется уникальным (например, есть группа клиентов с rn = 1).Я не понимаю почему.Разве rn не должен быть просто номером строки?

1 Ответ

1 голос
/ 23 сентября 2019

Удалите partition by в определении row_number():

with cte as (
      select customerid, sum(price) as total_pay, 
            row_number() over (order by total_pay desc) as rn 
      from my_table
      group by customerid
     )
select *
from cte
where rn = 5;

Вы уже агрегируете по customerid, поэтому у каждого клиента есть только одна строка.Таким образом, значение rn всегда будет 1.

...