Sql 检索一对多关系中的最高值
我有一张贷款表和一张财产表。一对多关系。如果贷款包含多个房产,我只需检索评估值最高的房产 下面的查询Sql 检索一对多关系中的最高值,sql,postgresql,greatest-n-per-group,Sql,Postgresql,Greatest N Per Group,我有一张贷款表和一张财产表。一对多关系。如果贷款包含多个房产,我只需检索评估值最高的房产 下面的查询 SELECT l.loan_id,p_count FROM loans lo JOIN (SELECT loan_id, MAX(appraised_value) AS val COUNT(property_id) AS p_count FROM properties GROUP BY loan_id) AS pc ON pc.loan_id = lo.id
SELECT l.loan_id,p_count
FROM loans lo
JOIN
(SELECT loan_id, MAX(appraised_value) AS val
COUNT(property_id) AS p_count
FROM properties
GROUP BY loan_id) AS pc ON pc.loan_id = lo.id
给我输出
loan_id val p_count
817 914,000 2
但是,如果我试图从properties表中检索其他属性(例如type、address),我将获得该贷款的所有属性记录(在本例中为2)。我写了这个查询
SELECT l.loan_id,p_count
FROM loans lo
JOIN
(SELECT loan_id, MAX(appraised_value), type, address AS val
COUNT(property_id) AS p_count
FROM properties
GROUP BY loan_id) AS pc ON pc.loan_id = lo.id
要获得以下输出:
loan_id val p_count type address
817 800,000 2 duplex 123 main street
817 914,000 2 triplex 234 cedar avenue
如何获得最高评估值的以下输出
loan_id val p_count type address
817 914,000 2 triplex 234 cedar avenue
您可以使用
ROW\u NUMBER()
分析函数对记录进行排序:
select
x.loan_id
,x.val
,x.p_count
,x.type
,x.address
from (
select
l.loan_id
,p.appraised_value as val
,p.type
,p.address
,row_number() over (partition by l.loan_id order by p.appraised_value desc) as ranker
,count(1) over (partition by l.loan_id) as p_count
from loans l
left join properties p
on l.loan_id = p.loan_id
) x
where x.ranker = 1
您可以使用
ROW\u NUMBER()
分析函数对记录进行排序:
select
x.loan_id
,x.val
,x.p_count
,x.type
,x.address
from (
select
l.loan_id
,p.appraised_value as val
,p.type
,p.address
,row_number() over (partition by l.loan_id order by p.appraised_value desc) as ranker
,count(1) over (partition by l.loan_id) as p_count
from loans l
left join properties p
on l.loan_id = p.loan_id
) x
where x.ranker = 1
您可以使用窗口函数计算每笔贷款的房地产数量以及同一查询中的最高值:
SELECT lo.id, pc.p_count, pc.appraised_value, pc.type, pc.address
FROM loans lo
JOIN (
SELECT loan_id,
appraised_value,
type,
address,
count(*) over (partition by loan_id) AS p_count,
dense_rank() over (partition by loan_id order by appraised_value desc) as rnk
FROM properties
) AS pc ON pc.loan_id = lo.id and rnk = 1;
正如Josh所评论的,如果两处房产具有相同的最高估价,则将列出这两处房产。如果您不想这样做,请使用
行数()
而不是密集列数()
您可以使用窗口函数计算每笔贷款的房地产计数以及同一查询中的最高值:
SELECT lo.id, pc.p_count, pc.appraised_value, pc.type, pc.address
FROM loans lo
JOIN (
SELECT loan_id,
appraised_value,
type,
address,
count(*) over (partition by loan_id) AS p_count,
dense_rank() over (partition by loan_id order by appraised_value desc) as rnk
FROM properties
) AS pc ON pc.loan_id = lo.id and rnk = 1;
正如Josh所评论的,如果两处房产具有相同的最高估价,则将列出这两处房产。如果您不想这样做,请使用row\u number()
而不是densite\u rank()
尝试以下方法:
proc sql;
select a.loan_id,p1.val,p1.p_count,p2.type,p2.address
from
loans l
left join
(select loan_id,max(appraised_value) as val,count(propoerty_id) as p_count
from propoerties
group by loan_id) p1
on l.id = p1.loan_id
left join
propoerties p2
on p1.loan_id = p2.loan_id and p1.val=p2.appraised_value;
如果您有任何不同的要求,请告诉我。试试这个:
proc sql;
select a.loan_id,p1.val,p1.p_count,p2.type,p2.address
from
loans l
left join
(select loan_id,max(appraised_value) as val,count(propoerty_id) as p_count
from propoerties
group by loan_id) p1
on l.id = p1.loan_id
left join
propoerties p2
on p1.loan_id = p2.loan_id and p1.val=p2.appraised_value;
如果您有任何不同的要求,请告诉我。
按贷款id从属性组中选择贷款id,最大值(评估值),键入,地址作为val计数(属性id)作为p计数。
此子查询不会给您错误?选择贷款id,最大值(评估值),键入,地址作为val计数(属性id)由于“按贷款id”属性组中的p_计数,此子查询不会显示错误?您的输出字段与所需的输出不匹配。此查询还将返回多行,其中两个属性具有相同的评估值。可能还可以,具体取决于需求。densite\u rank
成功了。接受并投票通过。谢谢。您的输出字段与所需的输出不匹配。此查询还将返回多行,其中两个属性的值相同。可能还可以,具体取决于需求。densite\u rank
成功了。接受并投票通过。非常感谢。