Выберите последние две записи для каждого клиента в PostgreSQL - PullRequest
2 голосов
/ 21 октября 2011

Можете ли вы показать мне запрос для следующего сценария?У меня есть эти столбцы в таблице access_log:

customer_id |  service_name | accessed_time

Клиент мог получить доступ к услуге любое количество раз.Но мне нужно перечислить только последние две записи для каждого customer_id.

Ответы [ 2 ]

11 голосов
/ 21 октября 2011

Оконные функции на помощь (снова):

select customer_id, service_name, accessed_time
from (
    select customer_id, service_name, accessed_time,
           rank() over (partition by customer_id order by accessed_time desc) as rank
    from access_log
) dt
where dt.rank <= 2

Предполагается, что «последние два» означают «два последних».Оконная функция row_number может быть более подходящей в зависимости от того, как вы хотите обрабатывать дубликаты.

Учитывая данные, подобные этим (извините, сегодня вечером я не чувствую, что образно):

=> select * from access_log order by customer_id, accessed_time;
 customer_id | service_name |    accessed_time    
-------------+--------------+---------------------
           1 | one          | 2011-01-01 00:00:00
           1 | two          | 2011-01-02 00:00:00
           1 | three        | 2011-01-03 00:00:00
           2 | two          | 2011-01-02 00:00:00
           2 | one          | 2011-04-01 00:00:00
           2 | three        | 2011-05-03 00:00:00

приведенный выше запрос дает:

 customer_id | service_name |    accessed_time    
-------------+--------------+---------------------
           1 | three        | 2011-01-03 00:00:00
           1 | two          | 2011-01-02 00:00:00
           2 | three        | 2011-05-03 00:00:00
           2 | one          | 2011-04-01 00:00:00
5 голосов
/ 21 октября 2011

Что-то в этом духе должно работать:

select * from access_log a1
where 2 > (select count(*) from access_log a2
           where a1.customer_id = a2.customer_id
           and a1.accessed_time < a2.accessed_time)

Это гласит: получить все журналы, для которых существует 0 или 1 другие журналы доступа для того же клиента с более поздним "accessed_time".Убедитесь, что у вас есть соответствующие индексы в соответствующих столбцах.

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