繁体   English   中英

多级查询从第二个子查询获取值以驱动父元素

[英]Multi-level query to get value from second sub-query to drive parent element

我正在尝试获取一个多级查询,以给我提供一个简单的答案。 我有2500行针对邮政编码的数据。 每行包含一个邮政编码,个人的姓名缩写,主要成本和次要成本。 我想根据原始成本获得最低的邮政编码成本-这有点容易-但是,如果对于同一邮政编码,有不止一个人具有相同的原始成本,我需要退还最低成本的那个。 例:

postcode, initials, p_cost, s_cost
AB12    , DS      , 100   , 0
AB12    , JH      , 100   , 40
AB12    , SS      , 120   , 0

因此,从这里开始,我想介绍一下DS,因为它们与JH一起具有最低的主成本,但它们在两者中的辅助成本也最低。 这是到目前为止的SQL:

SELECT initials, min(s_cost) FROM
    (SELECT * FROM MyTable
     WHERE postcode = 'AB12'
     and p_cost = 
        (select min(p_cost) from MyTable 
         WHERE postcode = 'AB12'));

我也尝试过:

SELECT * FROM MyTable
WHERE postcode = 'AB12' 
and p_cost = (select min(p_cost) 
               from MyTable 
               WHERE postcode = 'AB12'
               and s_cost = (select min(s_cost) 
                                     from MyTable 
                                     WHERE postcode = 'AB12'));

有人可以在这里让我摆脱痛苦,这应该很简单,但是距我上次编写SQL和愤怒的SQL已有15年了,这确实困扰了我。

谢谢大家的帮助 :-)

您是否尝试过使用联接条件作为过滤器将表联接到自身?

select mt1.* 
from mytable mt1
left join mytable mt2 
    on mt1.postcode = mt2.postcode 
        and ( mt1.p_cost < mt2.p_cost 
         or (mt1.p_cost = mt2.p_cost and mt1.s_cost < mt2.s_cost)
        )
where mt1.postcode = 'AB12'

这段代码未经测试。

也许您可以尝试一下。

Select * 
from MyTable 
where postcode = 'AB12' 
order by p_cost asc, s_cost asc 
limit 1;

首先,您需要计算每个邮政编码的最低p_cost是多少

 SELECT postcode, MIN(primary_cost) as min_primary_cost
 FROM MyTable 
 WHERE postcode = 'AB12'

现在,您需要根据“主要费用”计算“ secondary_cost”的最小值

 SELECT primary_cost, MIN(secondary_cost) as min_primary_cost
 FROM MyTable 
 WHERE postcode = 'AB12'
 GROUP BY primary_cost

现在将两者结合在一起

SQL演示

SELECT *
FROM YourTable
JOIN ( SELECT postcode, MIN(primary_cost) as min_primary_cost
       FROM YourTable 
       WHERE postcode = 'AB12'
     ) as p_cost
ON YourTable.postcode = p_cost.postcode
AND YourTable.primary_cost = p_cost.min_primary_cost
JOIN ( SELECT primary_cost, MIN(secondary_cost) as min_secondary_cost
       FROM YourTable 
       WHERE postcode = 'AB12'
       GROUP BY primary_cost
     ) as s_cost
  ON YourTable.primary_cost = s_cost.primary_cost
 AND YourTable.secondary_cost= s_cost.min_secondary_cost
WHERE postcode = 'AB12'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM