前2名的平均值

时间:2019-09-13 17:00:51

标签: sql

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

Limit1 objectid 来自表p_coverage。 策略来自表p_risk。 表p_item是p_risk和p_coverage之间的链接表。

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

但是排名不起作用,并且给出错误的结果。如果我从ONE表中获取列,我的查询将起作用,但是一旦在它们之间添加联接,它将给出错误的排名。

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的查询结果

enter image description here

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分:0)

如果我理解正确,您希望子查询中的ROW_NUMBER() then 在外部查询中进行汇总和过滤:

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