Как выбрать 2 верхних значения для каждого идентификатора - PullRequest
0 голосов
/ 22 октября 2019

У меня есть таблица со значениями

id  sales     date
1   5   "2015-01-04"
1   3   "2015-01-03"
1   1   "2015-01-01"
1   1   "2015-01-01"
2   7   "2015-01-05"
2   6   "2015-01-04"
2   4   "2015-01-03"
3   11  "2015-01-08"
3   10  "2015-01-07"
3   9   "2015-01-06"
3   8   "2015-01-05"

Я хочу выбрать два верхних значения каждого идентификатора, как показано в желаемом выводе.

Желаемый вывод:

id   sales     date
 1    5        "2015-01-04"
 1    3        "2015-01-03"
 2    7        "2015-01-05"
 2    6        "2015-01-04"
 3    11       "2015-01-08"
 3    10       "2015-01-07"

Моя попытка:

Может кто-нибудь помочь мне с этим. Заранее спасибо!

select transactions.salesperson_id, transactions.id, transactions.date
from transactions
ORDER BY transactions.salesperson_id ASC, transactions.date DESC;

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

Это можно сделать с помощью оконных функций:

select id, sales, "date"
from (
  select id, sales, "date", 
         dense_rank() over (partition by id order by "date" desc) as rnk
  from transactions
) t
where rnk <= 2;

Если в одну и ту же дату есть несколько строк, это может вернуть более двух строк для одного и того же идентификатора. Если вы не хотите этого, используйте row_number() вместо dense_rank()

0 голосов
/ 22 октября 2019

row_number() получит то, что вы хотите.

select * from 
    (select row_number() over (partition by id order by date) as rn, sales, date from transactions) t1
where t1.rn <= 2
...