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
в подзапросе.