vsql / Vertica: выберите 5 лучших строк по группе - PullRequest
0 голосов
/ 25 января 2019

У меня есть запрос, который должен занять первые n строк сгруппированных данных. Я использовал RANK() в сочетании с OVER PARTITION BY для определения первых n строк в группе:

SELECT X.USERID, X.ARTID, X.AVGTIMEONPAGE,EDP.ARTDSC,
RANK() OVER (PARTITION BY X.USERID ORDER BY X.AVGTIMEONPAGE DESC) as rank
FROM
(SELECT GANG.userID AS USERID,GANG.avgTimeOnPage AS AVGTIMEONPAGE,   
split_part(GANG.pageTitle,' -',1) as ARTID
FROM GoogleAnalytics.navigazioneG AS GANG
WHERE GANG.pagePath LIKE '%DataSheets%' ) AS X
LEFT JOIN ESPDDS.ESP_DPRODUCT AS EDP
ON EDP.ARTID=X.ARTID AND EDP.SCD_IS_CURRENT=1
AND EDP.COMPANYID=1
WHERE X.ARTID NOT LIKE '%Company%' AND rank in (1,2,3,4,5)

выдает ошибку, что столбец ранга не существует. Если я прокомментирую последнюю часть предложения WHERE, то увижу, что ранг столбца вычислен правильно.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Предложение WHERE оценивается перед предложением SELECT. Так что в то время rank неизвестно. Вы можете использовать дополнительный подзапрос для доступа к нему:

SELECT *
FROM
(
  SELECT 
    X.USERID, 
    X.ARTID, 
    X.AVGTIMEONPAGE,
    EDP.ARTDSC,
    RANK() OVER (PARTITION BY X.USERID ORDER BY X.AVGTIMEONPAGE DESC) as rank
  FROM
  (
    SELECT 
      GANG.userID AS USERID,
      GANG.avgTimeOnPage AS AVGTIMEONPAGE,   
      split_part(GANG.pageTitle,' -',1) as ARTID
    FROM GoogleAnalytics.navigazioneG AS GANG
    WHERE GANG.pagePath LIKE '%DataSheets%' 
  ) AS X
  LEFT JOIN ESPDDS.ESP_DPRODUCT AS EDP ON EDP.ARTID = X.ARTID
                                      AND EDP.SCD_IS_CURRENT = 1 
                                      AND EDP.COMPANYID = 1
  WHERE X.ARTID NOT LIKE '%Company%' 
) ranked
WHERE rank in (1,2,3,4,5);
0 голосов
/ 25 января 2019

Причина ошибки в том, что псевдоним rank недоступен на том же уровне. Еще одно замечание: используйте функцию dense_rank, так как в случае связей не будут пропущены числа.

SELECT USERID,ARTID, AVGTIMEONPAGE,ARTDSC,RANK
FROM
(SELECT GANG.userID AS USERID
       ,GANG.avgTimeOnPage AS AVGTIMEONPAGE
       ,split_part(GANG.pageTitle,' -',1) as ARTID
       ,RANK() OVER (PARTITION BY X.USERID ORDER BY X.AVGTIMEONPAGE DESC) as rank   
FROM GoogleAnalytics.navigazioneG AS GANG
LEFT JOIN ESPDDS.ESP_DPRODUCT AS EDP ON EDP.ARTID=X.ARTID AND EDP.SCD_IS_CURRENT=1
AND EDP.COMPANYID=1
WHERE GANG.pagePath LIKE '%DataSheets%'
) T 
WHERE ARTID NOT LIKE '%Company%' AND rank <= 5 
...