查询多个字段并返回集的最小值

时间:2018-02-20 05:23:57

标签: sql

我有一个复杂的(至少对我来说!)SQL问题,我一直试图解决。

我桌子的结构是:

Query: describe shipping_zones
+------------+--------+---------+
| name       | type   | comment |
+------------+--------+---------+
| key_id     | int    |         |
| carrier    | string |         |
| origin_zip | int    |         |
| dest_zip   | int    |         |
| zone       | int    |         |
+------------+--------+---------+

有三种类型的"运营商"

Query: select DISTINCT(carrier) FROM shipping_zones
+---------+
| carrier |
+---------+
| fedex   |
| ups     |
| usps    |
+---------+
Fetched 3 row(s) in 0.42s

我有这个查询,找到每个运营商返回两个区域:

SELECT carrier, zone
FROM shipping_zones
WHERE (origin_zip = 402 OR origin_zip = 950) AND dest_zip = 978;

+---------+------+
| carrier | zone |
+---------+------+
| ups     | 4    |
| ups     | 7    |
| fedex   | 7    |
| fedex   | 4    |
| usps    | 8    |
| usps    | 4    |
+---------+------+

问题是我只想从每个运营商返回最低的号码,而不是两者。我可以使用Min()还是有更好的方法来做它?

感谢您的帮助,感谢您理解SQL的帮助!

2 个答案:

答案 0 :(得分:1)

是的,您可以在按运营商分组后在每个运营商上使用Min()功能。分组将基本上“汇总”您要分组的列(在本例中为运营商),您应用的功能(在这种情况下为“Min”):

SELECT carrier, MIN(zone) as min_zone
FROM shipping_zones
WHERE (origin_zip = 402 OR origin_zip = 950) 
AND dest_zip = 978
GROUP BY carrier

答案 1 :(得分:1)

听起来你正在寻找聚合函数。但是,无论何时使用聚合函数,都必须告诉数据库引擎如何单独处理所有字段。如果你有一个文本字段,你只想在有重复的地方折叠,你可以使用group by子句。

SELECT carrier, min(zone)
FROM shipping_zones
WHERE (origin_zip = 402 OR origin_zip = 950) AND dest_zip = 978
group by carrier;