#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;