Запрос максимального заказа в течение 10 лет с первой записанной даты заказа - PullRequest
0 голосов
/ 29 октября 2019

Я должен получить максимальный заказ в течение 10 лет после первой записанной даты заказа. Я пробовал следующий запрос:

SELECT C.NAME, O.PRICE FROM CUSTOMERS C
    LEFT JOIN ORDERS O ON C.ORDER_ID = O.ID
    WHERE O.PRICE = (SELECT MAX(PRICE) FROM (SELECT * FROM ORDERS O2 WHERE O2.ORDER_DATE BETWEEN MIN(O2.ORDER_DATE) AND DATEADD(year, 10, MIN(O2.ORDER_DATE))))

, но выдает ошибку:

не выводится из таблицы.

Может кто-нибудь помочь указатьмоя ошибка?

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Используйте функции окна!

select o.*
from (select o.*,
             max(price) over (partition by customer_id) as max_price
      from (select o.*,
                   min(order_date) over (partition by o.customer_id) as first_order_date
            from orders o
           ) o
      where order_date < dateadd(year, 10, first_order_date)
     ) o
where price = max_price;

Я позволю вам присоединиться к таблице клиентов, чтобы получить имя и другую информацию о клиенте, которая вам может понадобиться.

Предполагается, что orders имеет некоторый столбец customer_id, как правило, такие таблицы создаются.

1 голос
/ 29 октября 2019

В своем коде вы используете MIN(O2.ORDER_DATE), не выводя его из запроса. Также нет необходимости в BETWEEN, потому что все, что вам нужно, это дата заказа до минимальной даты + 10 лет. Вы можете получить максимальную цену, отсортировав результат запроса по убыванию и сохранив только 1-ю строку:

SELECT TOP 1 C.NAME, O.PRICE 
FROM CUSTOMERS C INNER JOIN ORDERS O 
ON C.ORDER_ID = O.ID
WHERE O.ORDER_DATE <= DATEADD(year, 10, (SELECT MIN(ORDER_DATE) FROM ORDERS))
ORDER BY O.PRICE DESC

Я предполагаю, что вы используете SQL Server, поэтому я использую TOP 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...