Оптимизируйте выбор с помощью запроса условия max () или min () в Amazon Redshift - PullRequest
0 голосов
/ 04 декабря 2018

Теперь у меня есть таблица, которая выглядит следующим образом:

VisitorId   VisitId   visittime   hitNumber    Pagetitle  EventCategory
1001        0001      2017-12-31    1          Product    scroll down 
1001        0001      2017-12-31    2          Product    click   
1001        0001      2017-12-31    3          Product    Fill info
1002        0002      2017-12-31    1          Homepage   Download
1002        0002      2017-12-31    2          Contact    /
1002        0002      2017-12-31    3          Check out  Shopping cart
1002        0002      2017-12-31    4          Check out  Abandon shopping cart

Что мне нужно сделать, это всегда извлекать последнее действие, которое посетитель делает на нашем сайте.

Мое настоящее решение состоит в том, чтобы разделить таблицу на 2, взять максимальное количество попаданий и объединиться с оставшейся информацией, т.е.

Select 
    visitorid, 
    VisitId, 
    visittime, 
    MAX(a.hitnumber) action_hit, 
    b.Pagetitle, 
    b.EventCategory
from 
    table a
left join (
   Select
      visitorid, 
      visitId, 
      visittime,
      hitnumber, 
      Pagetitle, 
      EventCategory
   FROM 
      table ) b ON a.visitorid = b.visitorid AND a.visitId = b.visitId 
   AND a.visittime = b.visittime
GROUP BY 1,2,3,5,6
HAVING MAX(a.hitnumber) = b.hitnumber

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

У кого-нибудь есть идеи для этого?Большое спасибо за вашу помощь заранее!

1 Ответ

0 голосов
/ 04 декабря 2018

Попробуйте оконные функции:

select t.*
from (select t.*,
             row_number() over (partition by visitor_id, visit_id order by hit_number desc) as seqnum
      from table t
     ) t
where seqnum = 1;
...