将 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 排序,则为最大值)