如何在包含最昂贵产品的类别中查找产品
How to find products within the cateogry containing the most expensive product
我目前正在使用以下代码:
SELECT PROD_NO,
PROD_NAME,
PROD_TYPE
FROM PRODUCTS
WHERE PROD_SELL IN (SELECT MAX(PROD_SELL)
FROM PRODUCTS)
当前输出:
PROD_NO PROD_NAME PROD_TYPE
---------- ------------------------------ --------------------
40103 StarDome Tents
期望的输出:
PROD_NO PROD_NAME PROD_TYPE
---------- ------------------------------ --------------------
40100 Star Lite Tents
40101 Star Gazer-2 Tents
40102 Star Gazer-3 Tents
40103 StarDome Tents
这是因为 'StarDome' 产品具有最高的 prod_sell
我的代码returns 价格最高的产品类型。但是,该类型中有 4 种产品,我需要列出该类型中的所有产品(返回最高售价)。
我这辈子都想不通。
正如您评论的那样,查询另一个子查询的子查询...听起来效率很低,再次查询相同的 table(我猜是 3 次)。
示例数据:
SQL> select * From products;
PROD_NO PROD_NAME PROD_ PROD_SELL
---------- ------------ ----- ----------
40100 Star Lite Tents 200
40101 Star Gazer-2 Tents 100
40102 Star Gazer-3 Tents 150
40103 StarDome Tents 500 --> the most expensive, so - you want all "Tents" as a result
10000 Whatever Beds 400
10001 Something Bikes 450
6 rows selected.
SQL>
这是您当前的查询(如果我猜对了;table 产品被引用了 3 次):
SQL> select prod_no, prod_name, prod_type
2 from products --> first
3 where prod_type in (select prod_type
4 from products --> second
5 where prod_sell = (select max(prod_sell)
6 from products --> third
7 )
8 )
9 order by prod_no;
PROD_NO PROD_NAME PROD_
---------- ------------ -----
40100 Star Lite Tents
40101 Star Gazer-2 Tents
40102 Star Gazer-3 Tents
40103 StarDome Tents
SQL>
我建议您考虑另一种方法:使用分析函数按价格对产品进行排名,然后获取排名最高[=29]的产品=].
SQL> select prod_type,
2 max(prod_sell) max_prod_sell,
3 rank() over (order by max(prod_sell) desc) rnk
4 from products
5 group by prod_type;
PROD_ MAX_PROD_SELL RNK
----- ------------- ----------
Tents 500 1 --> Tents rank as "highest"
Bikes 450 2
Beds 400 3
SQL>
现在,将该查询用作子查询(或 CTE,就像我所做的那样):
SQL> with temp as
2 (select prod_type,
3 rank() over (order by max(prod_sell) desc) rnk
4 from products --> first
5 group by prod_type
6 )
7 select p.prod_no, p.prod_name, p.prod_type
8 from products p join temp t on t.prod_type = p.prod_type --> second
9 where t.rnk = 1
10 order by p.prod_no;
PROD_NO PROD_NAME PROD_
---------- ------------ -----
40100 Star Lite Tents
40101 Star Gazer-2 Tents
40102 Star Gazer-3 Tents
40103 StarDome Tents
SQL>
这与您得到的结果相同,但效率应该更高一些。当然,您不会注意到小 tables 有任何差异,但可能会随着行数越来越高。
我目前正在使用以下代码:
SELECT PROD_NO,
PROD_NAME,
PROD_TYPE
FROM PRODUCTS
WHERE PROD_SELL IN (SELECT MAX(PROD_SELL)
FROM PRODUCTS)
当前输出:
PROD_NO PROD_NAME PROD_TYPE
---------- ------------------------------ --------------------
40103 StarDome Tents
期望的输出:
PROD_NO PROD_NAME PROD_TYPE
---------- ------------------------------ --------------------
40100 Star Lite Tents
40101 Star Gazer-2 Tents
40102 Star Gazer-3 Tents
40103 StarDome Tents
这是因为 'StarDome' 产品具有最高的 prod_sell
我的代码returns 价格最高的产品类型。但是,该类型中有 4 种产品,我需要列出该类型中的所有产品(返回最高售价)。
我这辈子都想不通。
正如您评论的那样,查询另一个子查询的子查询...听起来效率很低,再次查询相同的 table(我猜是 3 次)。
示例数据:
SQL> select * From products;
PROD_NO PROD_NAME PROD_ PROD_SELL
---------- ------------ ----- ----------
40100 Star Lite Tents 200
40101 Star Gazer-2 Tents 100
40102 Star Gazer-3 Tents 150
40103 StarDome Tents 500 --> the most expensive, so - you want all "Tents" as a result
10000 Whatever Beds 400
10001 Something Bikes 450
6 rows selected.
SQL>
这是您当前的查询(如果我猜对了;table 产品被引用了 3 次):
SQL> select prod_no, prod_name, prod_type
2 from products --> first
3 where prod_type in (select prod_type
4 from products --> second
5 where prod_sell = (select max(prod_sell)
6 from products --> third
7 )
8 )
9 order by prod_no;
PROD_NO PROD_NAME PROD_
---------- ------------ -----
40100 Star Lite Tents
40101 Star Gazer-2 Tents
40102 Star Gazer-3 Tents
40103 StarDome Tents
SQL>
我建议您考虑另一种方法:使用分析函数按价格对产品进行排名,然后获取排名最高[=29]的产品=].
SQL> select prod_type,
2 max(prod_sell) max_prod_sell,
3 rank() over (order by max(prod_sell) desc) rnk
4 from products
5 group by prod_type;
PROD_ MAX_PROD_SELL RNK
----- ------------- ----------
Tents 500 1 --> Tents rank as "highest"
Bikes 450 2
Beds 400 3
SQL>
现在,将该查询用作子查询(或 CTE,就像我所做的那样):
SQL> with temp as
2 (select prod_type,
3 rank() over (order by max(prod_sell) desc) rnk
4 from products --> first
5 group by prod_type
6 )
7 select p.prod_no, p.prod_name, p.prod_type
8 from products p join temp t on t.prod_type = p.prod_type --> second
9 where t.rnk = 1
10 order by p.prod_no;
PROD_NO PROD_NAME PROD_
---------- ------------ -----
40100 Star Lite Tents
40101 Star Gazer-2 Tents
40102 Star Gazer-3 Tents
40103 StarDome Tents
SQL>
这与您得到的结果相同,但效率应该更高一些。当然,您不会注意到小 tables 有任何差异,但可能会随着行数越来越高。