【问题标题】:How to use an aggregate function in SQL WITH JOINS?如何在 SQL WITH JOINS 中使用聚合函数?
【发布时间】:2013-02-01 18:22:18
【问题描述】:

以下是我构建的查询,用于查找特定电影的最便宜价格以及销售它的发行商,我如何操作它以便列出所有电影及其各自的最高电影价格以及经销商是谁卖的?

/*finds the cheapest price for the movie "American Beauty" and the distributor who sells it*/
SELECT movies.title, movie_distributors.distributor_name, MIN(distributed_movie_list.unit_price) AS lowest_price 
FROM distributed_movie_list 
INNER JOIN movies ON distributed_movie_list.movie_id = movies.movie_id 
INNER JOIN movie_distributors ON movie_distributors.distributor_id = distributed_movie_list.distributor_id 
WHERE movies.title = 'American Beauty' 
AND distributed_movie_list.unit_price = 
    (SELECT MIN(unit_price) 
    FROM distributed_movie_list 
    INNER JOIN movies ON distributed_movie_list.movie_id = movies.movie_id 
    WHERE movies.title = 'American Beauty') 
GROUP BY movies.title, distributed_movie_list.distributor_id, movie_distributors.distributor_name;

以下表格用于此查询:

create table movies (
movie_id              number(5),
title                 varchar2(30) not null,
category_code         char(3) not null,
description           varchar2(500),
released_by           number(3) not null,
released_on           date not null
);

create table movie_distributors(
distributor_id      number(3),
distributor_name    varchar2(30) not null,
location            varchar2(40),
contact             varchar2(40)
);

create table distributed_movie_list(
distribution_id           number(8),
movie_id                  number(5) not null,
distributor_id            number(3) not null,
distribute_type           varchar2(10),
inventory_quantity        number(3) default 0,
unit_price                number(8,2)
);

我正在寻找的最终结果是列出每部电影的发行商和最高价格的查询。任何帮助将不胜感激 ; )

【问题讨论】:

  • 看来您已经知道如何找到最低电影价格了。您尝试过什么来找到最高的电影价格?
  • 您使用的是 MySQL 还是 SQL Server?你试过max而不是min吗?
  • @Jen Talbot:您使用的是哪个 RDBMS - SQLServer、MySQL、Oracle 等?答案将对查询产生影响。

标签: sql oracle


【解决方案1】:

我正在寻找的最终结果是一个列出分销商和 每部电影的最高价格

那为什么不只是 GROUP BY title, distributor_nameMAX 像这样:

SELECT 
  m.movie_id,
  m.title,
  md.distributor_name, 
  MAX(d.unit_price) AS Highest_price 
FROM distributed_movie_list   AS d
INNER JOIN movies             AS m  ON d.movie_id        = m.movie_id 
INNER JOIN movie_distributors AS md ON md.distributor_id = d.distributor_id 
GROUP BY m.movie_id,m.title,
         md.distributor_name
HAVING MAX(d.unit_price) = (SELECT MAX(d2.unit_price)
                            FROM  distributed_movie_list d2
                            WHERE m.movie_id = d2.movie_id)

【讨论】:

  • +1 可以distributed_movie_list 使用left join 更高效吗?
  • @bonCodigo 我认为这与效率无关,LEFT JOIN 将包括那些没有电影的发行商,在这种情况下最大将是NULL。但是,我没有添加这个等待看看这是否是 OP 正在尝试做的事情。
  • @MarkBannister 是的,你是对的,对不起,我错过了。我认为它现在应该修复了。
【解决方案2】:

以下内容应该适用于大多数 RDBMS:

SELECT DISTINCT m.title, md.distributor_name, dml.unit_price AS highest_price 
FROM distributed_movie_list dml
INNER JOIN movies m ON dml.movie_id = m.movie_id 
INNER JOIN movie_distributors md ON md.distributor_id = dml.distributor_id 
INNER JOIN (SELECT movie_id, MAX(unit_price) 
            FROM distributed_movie_list
            GROUP BY movie_id) dmlh
        ON dml.unit_price = dmlH.unit_price AND dml.movie_id = dmlh.movie_id

对于支持排名函数的 RDBMS(例如 Oracle 或 SQLServer),应该有更有效的解决方案。

【讨论】:

    【解决方案3】:

    如果您想获得每部电影的最高价格(以及相关信息),请使用row_number() 函数。以下查询返回有关每部电影最高价格的所有信息:

    select dml.*
    from (select dml.*,
                 ROW_NUMBER() over (partition by movie_id order by unit_price desc) as seqnum
          from distributed_movie_list dml 
         ) dml
    where seqnum = 1
    

    您可以加入有关电影和发行商的其他信息。

    【讨论】:

      猜你喜欢
      • 2022-09-28
      • 2020-06-08
      • 1970-01-01
      • 2017-01-29
      • 2015-12-29
      • 2016-11-04
      • 2014-01-04
      • 1970-01-01
      • 2013-02-27
      相关资源
      最近更新 更多