Как найти более дешевый продукт

#mysql #sql-server

#mysql #sql-сервер

Вопрос:

Я изучаю sql и столкнулся с проблемой. У меня есть три таблицы

 table Product(
  model varchar(50),
  maker varchar(50),
  type varchar(50),
  CONSTRAINT product_pk PRIMARY KEY (model)
); 

table PC (
  serial_number varchar(50),
  model varchar(50),
  price number,
  speed number,
  ram number,
  hd varchar(50),
  cd varchar(50),
  CONSTRAINT pc_pk PRIMARY KEY (serial_number),CONSTRAINT pc_2_product_fkFOREIGN KEY (model) REFERENCES Product(model)
); 

Laptop (
  serial_number varchar(50),
  model varchar(50),
  price number,
  speed number,
  ram integer,
  hdvarchar(50),
  screen varchar(50),
  CONSTRAINT laptop_pk PRIMARY KEY (serial_number),CONSTRAINT laptop_2_product_fk FOREIGN KEY (model) REFERENCES Product(model)
);
  

И мне нужно найти самый дешевый ПК или ноутбук с учетом скорости, оперативной памяти, HD. Если у вас есть какие-либо советы, я буду признателен. Спасибо

Комментарии:

1. Пожалуйста, объясните правила, которые вам необходимо соблюдать, чтобы считать, что компьютер или ноутбук дешевле другого, и покажите, что вы уже сделали

Ответ №1:

Прямой вариант — ранжировать каждую категорию и фильтровать ее. 1. Сначала объедините все таблицы для ПК и ноутбуков. 2. Присвоите ранг / dense_rank данным в порядке возрастания цены и уменьшения объема оперативной памяти. 3. Если вы отсортируете rank, вы получите самую дешевую машину с самой высокой конфигурацией по порядку.

примечание: Мы обычно выбираем процессор ram n перед покупкой ноутбука / ПК, поэтому в реальном сценарии решите, что вы хотите применить, чтобы фильтровать и ранжировать остальную информацию. Вы также можете фильтровать ценовой диапазон и сортировать остальную информацию.

Ответ №2:

Используйте предложение WHERE, чтобы ограничить результаты теми, которые соответствуют требованиям. Затем СДЕЛАЙТЕ ЗАКАЗ, чтобы сначала получить самый дешевый. Я не уверен, каковы ваши значения hd. Я предполагаю, что они имеют какой-то размер и их можно сравнить с одним значением.

 SELECT TOP 1 *
FROM PC
WHERE speed >= @speed_min AND ram >= @ram_min AND hd >= @hd_min
ORDER BY price ASC
  

Если вам нужен самый дешевый ноутбук, сделайте то же самое для ноутбука. Если вам нужны оба, используйте ОБЪЕДИНЕНИЕ ALL между двумя запросами.

Ответ №3:

Спасибо всем, кто не торопился отвечать, и я делюсь тем, как я на это ответил.

 WITH rank AS(
   SELECT row_number() OVER ( 
    PARTITION BY ram,speed,hd   
    ORDER BY price) position, maker,serial_number,speed,ram,hd,price,type 
    FROM (SELECT serial_number,speed,ram,hd,price,p.type,p.maker FROM product p JOIN laptop l ON p.model = l.model  
    UNION ALL SELECT serial_number,speed,ram,hd,price,p.type,p.maker FROM product p JOIN pc ON p.model = pc.model) 
    ORDER BY price 
)
SELECT maker,serial_number,speed,ram,hd,price,type FROM rank WHERE price = (SELECT MIN(price) FROM rank);