从记录的第一个订单日期起10年内查询最大订单

时间:2019-10-28 22:20:48

标签: sql sql-server

我应该从第一个记录的订单日期起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))))

但是它给出了以下错误:

  

不能从表导出。

有人可以帮我指出我的错误吗?

3 个答案:

答案 0 :(得分:1)

在代码中,您使用MIN(O2.ORDER_DATE)而不从查询中派生它。
另外,也不需要BETWEEN,因为您所需要的只是订购日期必须在最短日期+ 10年之前。
您可以通过对查询结果进行降序排序并仅保留第一行来获得最高价格:

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的原因。

答案 1 :(得分:1)

使用窗口功能!

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列,这通常是建立此类表的方式。

答案 2 :(得分:0)

    CREATE VIEW temp_order AS
    (SELECT PRICE, ID FROM ORDERS 
    WHERE ORDER_DATE <= DATE_ADD((SELECT MIN(ORDER_DATE) FROM ORDERS), INTERVAL 10 YEAR));
    SELECT C.NAME, PRICE 
    FROM CUSTOMERS C JOIN 
    temp_order ON C.ORDER_ID = temp_order.ID 
    WHERE PRICE = (SELECT MAX(PRICE) FROM temp_order);