Получение 2 строк с минимальным и максимальным значением из таблицы - PullRequest
0 голосов
/ 23 января 2019

У меня есть таблица Product со следующими столбцами:

id  | product_name | price

1   | Red Shirt    | 10.0
2   | White Shirt  | 15.0
3   | Black Shirt  | 9.0
4   | Yellow Shirt | 12.0

Как я могу сделать запрос, который будет возвращать строки, которые имеют max (цена) и min (цена)?Используя приведенный выше пример, выведите:

id  | product_name | price

3   | Black Shirt  | 9.0
2   | White Shirt  | 15.0

В случае повторяющихся значений не имеет значения, какое из них выбрано, если на выходе только 2 строки.

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Вы можете сделать это, используя аналитическую функцию ROW_NUMBER(), которая использует только сканирование одной таблицы (в отличие от решений, использующих UNION или подзапросы).

Установка Oracle :

CREATE TABLE product ( id, product_name, price ) AS
SELECT 1, 'Red Shirt',    10.0 FROM DUAL UNION ALL
SELECT 2, 'White Shirt',  15.0 FROM DUAL UNION ALL
SELECT 3, 'Black Shirt',   9.0 FROM DUAL UNION ALL
SELECT 4, 'Yellow Shirt', 12.0 FROM DUAL UNION ALL
SELECT 5, 'Blue Shirt',    9.0 FROM DUAL

Запрос :

SELECT id, product_name, price
FROM   (
  SELECT p.*,
         ROW_NUMBER() OVER ( ORDER BY price ASC  ) As min_price_rn,
         ROW_NUMBER() OVER ( ORDER BY price DESC ) As max_price_rn
  FROM   product p
)
WHERE min_price_rn = 1
OR    max_price_rn = 1;

выход

ID | PRODUCT_NAME | PRICE
-: | :----------- | ----:
 2 | White Shirt  |    15
 3 | Black Shirt  |     9

дБ <> скрипка здесь

0 голосов
/ 23 января 2019

Вы также можете сделать это:

select *
from product
where price in (
          (select min(price) from product),
          (select max(price) from product)
);

Или вы можете сделать объединение, как показано ниже:

- Подход UNION

Select *
from Product
where price = (select min(price) from Product)
union
select *
from Product
where price = (select max(price) from Product);

Использовано следующее:

Create Table Product(id int, product_name varchar(20), price decimal);

Insert into Product values (1, 'Red Shirt', 10.0);
Insert into Product values (2, 'White Shirt', 15.0);
Insert into Product values (3, 'Black Shirt', 9.0);
Insert into Product values (4, 'Yellow Shirt', 12.0);

Select *
from Product
where Price in (
          (select min(Price) from Product),
          (select max(Price) from Product)
);

Окончательный вывод:

Id  Product_Name    Price
2   White Shirt     15
3   Black Shirt     9
0 голосов
/ 23 января 2019

Несколько других ответов не удовлетворяют последнему требованию ... 'В случае повторных значений, не имеет значения, какое из них выбрано, поскольку вывод составляет всего 2 строки.'

Они вернут три строки, если есть два продукта с одинаковым значением.

нижеприведенное можно обойти, добавив предложение rownum = 1.

with testtab (id, product_name, price) as
(select 1, 'Red Shrit', 10.00 from dual
 union 
 select 2, 'Whtie Shrit', 15.00 from dual
 union 
 select 3, 'Black Shrit', 9.00 from dual
 union 
 select 4, 'Yellow Shrit', 12.00 from dual
 union 
 select 4, 'Pink Shrit', 15.00 from dual)
select id, product_name, price 
from testtab 
where price in (select max(price) from testtab)
and rownum = 1
union
select id, product_name, price 
from testtab where price in (select min(price) from testtab)
and rownum = 1
0 голосов
/ 23 января 2019

Вы можете использовать условие Or в вашем состоянии where.

with cte as (select 1 as ID, 'Red Shirt' as Product_name, 10.0 as price from dual 
union all 
select 2 as ID, 'White Shirt' as Product_name, 15.0 as price from dual 
union all 
select 3 as ID, 'Black Shirt' as Product_name, 9.0 as price from dual 
union all 
select 4 as ID, 'Yellow Shirt' as Product_name, 12.0 as price from dual ) 

select * from cte 
where price = (select min(price) minprice from cte) or price = (select max(price) 
maxprice from cte); 

Выход:

  ID    PRODUCT_NAME    PRICE
   2    White Shirt     15 
   3    Black Shirt      9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...