0

我想获得每个policyid的 top2 limit1的平均值。我需要我的结果表也有objectid

Limit1objectid来自表 p_coverage。 Policyid来自表 p_risk。表 p_item 是 p_risk 和 p_coverage 之间的链接表。

我认为我应该构建查询的方式是:在每个policyid中创建一个limit1排名。然后取平均top2。

但是排名不起作用并给出错误的结果。如果我从一个表中获取列,我的查询就可以工作,但是一旦我在它们之间添加连接,它就会给出错误的排名。

SELECT policyid, limit1,  /*pcob,*/ RANK() OVER(PARTITION BY policyid ORDER BY limit1 DESC) AS rn
FROM   (SELECT policyid, limit1/*, pc.objectid ASpcob*/ 
        FROM p_risk pr 
        LEFT JOIN p_item 
          ON pr.objectid=p_item.riskobjectid 
        LEFT JOIN p_coverage pc 
          ON p_item.objectid=pc.insuranceitemid) AS s
        ) AS SubQueryAlias
GROUP BY
        policyid, limit1/*, pcob*/, rn
        ORDER BY rn,policyid,limit1 DESC

图片末尾的桌子是我想要的。第一张表是Golden Linoff的查询结果

在此处输入图像描述

4

2 回答 2

1

如果我理解正确,您希望ROW_NUMBER()在子查询中,然后在外部查询中聚合和过滤:

SELECT policyid, AVG(limit1) as avg_top2_limit1
FROM (SELECT policyid, limit1,
             DENSE_RANK() OVER (PARTITION BY policyid ORDER BY limit1 DESC) as seqnum
      FROM p_risk pr LEFT JOIN
           p_item i
           ON pr.objectid = i.riskobjectid LEFT JOIN
           p_coverage pc 
           ON i.objectid = pc.insuranceitemid) AS s
        ) p
WHERE seqnum <= 2
GROUP BY policyid
于 2019-09-13T17:04:14.243 回答
1

感谢之前的评论!我成功地做我想做的事。有查询

 select b.policyid, avg(b.limit1) as avg_top2_limit1 from(
 SELECT distinct(policyid) policyid, limit1 
 FROM (SELECT policyid, limit1,
         Dense_rank() OVER (PARTITION BY policyid ORDER BY limit1 DESC) as 
seqnum
  FROM p_risk pr LEFT JOIN
       p_item i
       ON pr.objectid = i.riskobjectid LEFT JOIN
       p_coverage pc 
       ON i.objectid = pc.insuranceitemid) AS s

 WHERE seqnum <= 2 ) as b
 GROUP BY policyid`
于 2019-09-13T18:22:09.153 回答