[英]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
现在将两者结合在一起
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.