SQL множественный выбор с COUNT(*)

Обычно я не работаю в SQL, но я работаю в Oracle Responsys и столкнулся с небольшим сложным запросом фильтрации списка, который, я считаю, может быть решен с помощью SQL.

У меня есть список из 250 000 идентификаторов клиентов, которыми управляют 10 000 представителей. С каждым идентификатором клиента также связана дата.

REPRESENTATIVE_ID | CUSTOMER_ID | SIGNUP_DATE
------------------+-------------+------------
1111111           | 11111111    | 2018-01-01
1111111           | 22222222    | 2017-03-02
1111111           | 33333333    | 2017-01-02
2222222           | 44444444    | 2016-03-08
3333333           | 00000000    | 2017-01-02
3333333           | 99999999    | 2016-03-08

Что я хочу сделать, это вернуть список первых 25 записей для каждого REPRESENTATIVE_ID, упорядоченный в хронологическом порядке, поэтому, если REP 1111111 имеет 100 записей, я хочу видеть только первые 25 записей для этого представителя.

Бонусные баллы - я также пытаюсь получить COUNT для каждого представителя на основе ВСЕГО списка, а не отфильтрованного представления (AKA REP 1111111 ВСЕГО = 785 записей)

Извиняюсь за форматирование, я также новичок в StackExchange.

1 ответ

Вы хотите использовать оконные функции, row_number() особенно:

select t.*
from (select t.*,
             row_number() over (partition by representative_id order by signup_date) as seqnum
      from t
     ) t
where seqnum <= 25;

Чтобы получить количество, вы можете использовать:

count(*) over (partition by reprsentative_id) as cnt

в подзапросе.

Другие вопросы по тегам