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)')
这是我当前的查询:
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)')