Redshift: альтернатива фильтрации 1-й строки после «row_number () partition by», с лучшей производительностью - PullRequest
0 голосов
/ 24 октября 2018

В этом примере я пытаюсь получить дату и время продукта 1-го заказа от каждого клиента.

Мой запрос выглядит так:

select * from(
    select customerid,
           orderdatetime,
           productname,
           row_number() over (partition by customerid order by orderdatetime) rn
    from t
) where rn=1

В таблице t, customerid + orderdatetime может служить первичным ключом, в то время как productname - символы свободного текста.Клиентов огромное количество, и каждый заказчик сделал значительное количество заказов.

Мне кажется, что в этом запросе большая часть затрат тратится на order by, потому что я хочу только самый ранний (минимум).Есть ли на самом деле такие отходы?Есть ли альтернативный способ получить результат, который быстрее?

Я использую Amazon Redshift.

1 Ответ

0 голосов
/ 24 октября 2018

вы можете попробовать с помощью коррелированных подзапросов, так как идентификатор клиента и время заказа являются первичным ключом, поэтому это может помочь повысить производительность

select t.* from your_table t 
     where orderdatetime = (select min(orderdatetime) from your_table t1
                                       where t1.customerid=t.customerid
                                       )
...