Как яйцевидный дубликат кода в подзапросе sql — запроса

#sql

Вопрос:

Я новичок в SQL. Нужна помощь, чтобы улучшить мой запрос к яйцевидному дублирующему коду.

 SELECT customers.name, orders.price FROM customers  JOIN orders ON orders.id = customers.order_id WHERE customers.order_id IN ( SELECT orders.id FROM orders  WHERE orders.price = (  SELECT orders.price  FROM orders  WHERE orders.order_date BETWEEN  (SELECT MIN(orders.order_date) FROM orders)   AND   (SELECT DATE_ADD(MIN(orders.order_date), INTERVAL 10 year)FROM orders)  ORDER BY orders.price DESC LIMIT 1  )  AND orders.order_date BETWEEN   (SELECT MIN(orders.order_date) FROM orders)   AND   (SELECT DATE_ADD(MIN(orders.order_date), INTERVAL 10 year)FROM orders) )  

Мне бы хотелось, чтобы здесь был яйцевидный дубликат кода

 SELECT MIN(orders.order_date) FROM orders  

и

 SELECT DATE_ADD(MIN(orders.order_date), INTERVAL 10 year)FROM orders  

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

1. Какие СУБД вы используете?

Ответ №1:

Вы можете использовать С, чтобы получить первые заказы на 10 лет. По дефициту не существует заказов с датой lt; мин(дата), так что вам это не between нужно, просто lt;= .

 firstOrders as (  SELECT *  FROM orders  WHERE order_date lt;=   (SELECT DATE_ADD(MIN(o.order_date), INTERVAL 10 year)  FROM orders o) ) SELECT customers.name, orders.price FROM customers  JOIN FirsrOrders orders ON orders.id = customers.order_id AND orders.price = (  select price  from firstOrders  order py price desc  limit 1 )   

Ответ №2:

Вам нужны заказы за первые десять лет, где цена была равна максимальной цене среди этих заказов. Так что ранжируйте по цене и захватите тех, кто занимает место № 1.

 with data as (  select *,  date_add(min(order_date) over (), interval 10 year) as max_date,  rank() over (order by price desc) as price_rank  from orders ) select * from data where order_date lt;= max_date and price_rank = 1;