我想获取每个 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的查询结果
答案 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