将 group by 与集合一起使用
using group by with sets
我可能问错了问题,但在过去的 12 小时里我一直在努力解决这个问题(我是初学者)并且无法完全找到如何获得我想要的东西:
我有以下 table 称为 "shipping_prices"
这是我希望查询执行的操作:
Return 在每个速度内比较每个运营商后的最便宜价格(因此结果是慢速、中速、快速的较低值)。
我写了这个查询:
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;
但是这 returns 每个承运人在每个速度级别的 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 导入的数据进行查询。
谢谢!
这可以通过 MIN
window 函数来完成。 sub-query 获取每个速度的最低价格。 PARTITION BY speed
对速度值进行分组,MIN(price)
为该分组的每个速度获取 min
价格。 (运行 内部查询以形成对 window 函数工作原理的直观理解)。此后,要获取该行,请使用过滤条件。
SELECT carrier,speed,min_price
FROM (SELECT carrier, speed, price, MIN(price) OVER(PARTITION BY speed) as min_price
FROM shipping_prices
WHERE total_wt = 45 and zone = 8
) t
WHERE price=min_price
您可以使用像 dense_rank
这样的排名函数来完成相同的操作,当不同运营商以相同的速度提供相同的最低价格时,它会处理平局。
SELECT carrier,speed,price as min_price
FROM (SELECT carrier, speed, price, DENSE_RANK() OVER(PARTITION BY speed ORDER BY price) as rnk
FROM shipping_prices
WHERE total_wt = 45 and zone = 8
) t
WHERE rnk=1
这个查询应该有效:
SELECT T1.carrier, T1.speed, T1.min_price
FROM (SELECT id
FROM shipping_pricing
ORDER BY speed, min_price) AS Q1
INNER JOIN shipping_pricing AS T1 ON T1.id = Q1.id
GROUP BY T1.speed;
sub-query 正确排序数据,returns 只有 id,主查询加入 id 并获取您想要的数据。通过对排序数据进行分组,您知道这些值是最小值(如果您使用 desc
排序,则为最大值)
我可能问错了问题,但在过去的 12 小时里我一直在努力解决这个问题(我是初学者)并且无法完全找到如何获得我想要的东西:
我有以下 table 称为 "shipping_prices"
这是我希望查询执行的操作: Return 在每个速度内比较每个运营商后的最便宜价格(因此结果是慢速、中速、快速的较低值)。
我写了这个查询:
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;
但是这 returns 每个承运人在每个速度级别的 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 导入的数据进行查询。
谢谢!
这可以通过 MIN
window 函数来完成。 sub-query 获取每个速度的最低价格。 PARTITION BY speed
对速度值进行分组,MIN(price)
为该分组的每个速度获取 min
价格。 (运行 内部查询以形成对 window 函数工作原理的直观理解)。此后,要获取该行,请使用过滤条件。
SELECT carrier,speed,min_price
FROM (SELECT carrier, speed, price, MIN(price) OVER(PARTITION BY speed) as min_price
FROM shipping_prices
WHERE total_wt = 45 and zone = 8
) t
WHERE price=min_price
您可以使用像 dense_rank
这样的排名函数来完成相同的操作,当不同运营商以相同的速度提供相同的最低价格时,它会处理平局。
SELECT carrier,speed,price as min_price
FROM (SELECT carrier, speed, price, DENSE_RANK() OVER(PARTITION BY speed ORDER BY price) as rnk
FROM shipping_prices
WHERE total_wt = 45 and zone = 8
) t
WHERE rnk=1
这个查询应该有效:
SELECT T1.carrier, T1.speed, T1.min_price
FROM (SELECT id
FROM shipping_pricing
ORDER BY speed, min_price) AS Q1
INNER JOIN shipping_pricing AS T1 ON T1.id = Q1.id
GROUP BY T1.speed;
sub-query 正确排序数据,returns 只有 id,主查询加入 id 并获取您想要的数据。通过对排序数据进行分组,您知道这些值是最小值(如果您使用 desc
排序,则为最大值)