SQL 如何从所有客户检索最后订购的 2 个列出的产品?

SQL how to retrieve last ordered 2 of the listed products from all customers?

这是我当前的查询:

SELECT 
    c.name, c.email, c.phone, sol.description, so.orderDate 
FROM 
    SalesOrderLine sol
JOIN 
    SalesOrder so ON sol.salesOrderID = so.id
JOIN 
    Customer c ON so.customerID = c.id
WHERE 
    (orderDate >= '2020-05-01' AND orderDate <= '2020-09-09')
    AND (description LIKE '%Seed Mix%' OR description LIKE '%Sesame Seeds (Natural)%')
ORDER BY 
    c.name

目标

我的目标是检索产品是混合种子或芝麻的位置。在两个日期之间。但只显示每个客户最近订购这两种产品的日期。

输出:

问题

我如何才能获得他们为查询中提到的第一个或第二个产品订购的最早日期?

期望的输出:

您可以使用 row_number():

SELECT *
FROM (
    SELECT c.name, c.email, c.phone, sol.description, so.orderDate,
        RANK() OVER(PARTITION BY c.id, sol.product_id ORDER BY so.orderDate DESC) rn
    FROM SalesOrderLine sol
    JOIN SalesOrder so ON sol.salesOrderID = so.id
    JOIN Customer c ON so.customerID = c.id
    WHERE 
        orderDate >= '20200501' 
        AND orderDate <= '20200909'
        AND (description LIKE '%Seed Mix%' OR description LIKE '%Sesame Seeds (Natural)%')
) t
WHERE rn = 1
ORDER BY name

注意:您似乎在 description 上有完全匹配。如果是这样,使用相等性检查比模式匹配更有效。所以:

AND description IN ('Seed Mix', 'Sesame Seeds (Natural)')