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

Posted

技术标签:

【中文标题】SQL如何从所有客户中检索最后订购的2个列出的产品?【英文标题】:SQL how to retrieve last ordered 2 of the listed products from all customers? 【发布时间】:2021-03-22 02:07:36 【问题描述】:

这是我当前的查询:

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

目标

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

输出:

问题

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

期望的输出:

【问题讨论】:

为什么 customername2 有 3 条同一日期的记录? 【参考方案1】:

你可以使用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)')

【讨论】:

使用order by name而不使用c. @LV98:好的,我调整了查询​​。我假设您在 SaleOrderLine 中有一个名为 product_id 的列来标识产品。您可能需要对此进行审核。

以上是关于SQL如何从所有客户中检索最后订购的2个列出的产品?的主要内容,如果未能解决你的问题,请参考以下文章

SQL的一些查询语句

MYSQL 学习笔记记录整理之三:子查询

SQL Server 如何找到从每个商店购买产品的客户?

SQL:我如何按顺序列出所有前2个订单的客户ID:第一个订单是帽子,第二个订单是太阳镜? [关闭]

SQL如何从每个连接表中检索最新结果

编写一个 PL/SQL Proc 并在 proc 中调用一个函数。输入是productid。打印出订购产品 ID 的客户姓名