首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vsql/Vertica:按组选择前5行

vsql/Vertica:按组选择前5行
EN

Stack Overflow用户
提问于 2019-01-25 22:51:09
回答 2查看 433关注 0票数 0

我有一个查询,它应该接受分组数据的前n行。我结合使用了RANK()OVER PARTITION BY来标识每个组的前n行:

代码语言:javascript
复制
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子句的最后一部分,我可以看到列排名计算正确。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-25 22:55:41

在计算SELECT子句之前先计算WHERE子句。所以在那个时候,rank是未知的。您可以使用另一个子查询来访问它:

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2019-01-25 22:55:33

错误的原因是rank别名在同一级别不可用。另请注意,使用dense_rank函数,因为在平局的情况下数字不会被跳过。

代码语言:javascript
复制
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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54367655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档