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
成功了。接受并投票通过。非常感谢。