我可能问错了问题,但在过去的12个小时里,我一直在用我的头撞这个问题(我是个初学者),不知道如何得到我想要的:
我有下表“运费价格”
我希望我的查询是这样做的:在比较每个速度下的每个运营商后返回最便宜的价格(因此结果是slow、med、fast的值较低)。
我写了这个问题:
SELECT carrier, speed, MIN(price) AS min_price
FROM(
SELECT speed, total_wt, zone, carrier, price
FROM(
SELECT speed, zone, total_wt, carrier, price
FROM (
SELECT key_id, carrier, zone, total_wt, speed, price
FROM shipping_prices
WHERE (speed = 'slow' OR speed = 'med' OR speed = 'fast')
) AS return_price
WHERE total_wt = 45
) AS return_speed
WHERE zone = 8
) as return_zone
GROUP BY carrier, speed;
但这将返回每个运营商在每个速度级别的3个价格。
+---------+-------+-----------+
| carrier | speed | min_price |
+---------+-------+-----------+
| fedex | med | 257.23 |
| fedex | slow | 52.87 |
| fedex | fast | 328.16 |
| ups | med | 269.08 |
| ups | fast | 347.81 |
| ups | slow | 91.41 |
| usps | med | 103.95 |
| usps | fast | 261.1 |
| usps | slow | 97.78 |
+---------+-------+-----------+
我试着用子查询来解决这个问题,但也许使用联接更合适?
如果你要回答,请解释,因为我想理解。我经常遇到这种类型的问题,但我始终无法解决。
编辑:这是用impala查询的,数据是在mysql中创建的,并使用hive导入的。
谢谢您!
2条答案
按热度按时间6za6bjd01#
这可以通过
MIN
窗口功能。子查询获取每个速度的最小价格。PARTITION BY speed
组速度值和MIN(price)
得到min
每种速度的价格(运行内部查询以直观地了解窗口函数的工作方式)。此后,要仅获取该行,请使用筛选条件。您可以通过如下的排序函数来实现相同的功能
dense_rank
当不同的航空公司以相同的速度提供相同的最低价格时,它处理领带。iq0todco2#
此查询应适用于:
子查询正确地排序数据并只返回id,主查询连接id并获得所需的数据。通过对排序后的数据进行分组,您知道这些值是最小值(如果使用
desc
)