对集合使用groupby

gz5pxeao  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(270)

我可能问错了问题,但在过去的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导入的。
谢谢您!

6za6bjd0

6za6bjd01#

这可以通过 MIN 窗口功能。子查询获取每个速度的最小价格。 PARTITION BY speed 组速度值和 MIN(price) 得到 min 每种速度的价格(运行内部查询以直观地了解窗口函数的工作方式)。此后,要仅获取该行,请使用筛选条件。

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
iq0todco

iq0todco2#

此查询应适用于:

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;

子查询正确地排序数据并只返回id,主查询连接id并获得所需的数据。通过对排序后的数据进行分组,您知道这些值是最小值(如果使用 desc )

相关问题