【问题标题】:Select row from earliest date从最早日期选择行
【发布时间】:2012-07-27 15:09:44
【问题描述】:

我需要一个包含 2 列的所有产品列表,其中包含产品首次订购的日期和该产品的订购数量。

结构:
tbl_product
- 产品ID
- 产品名称

tbl_orderProduct
- orderProductID
- 订单ID
- 产品ID
- 数量

tbl_order
- 订单ID
- 订购日期

SELECT p.productName, firstOrder.orderedDate FROM tbl_product p
LEFT JOIN(
    SELECT op.productID, MIN(o.orderedDate) AS orderedDate FROM tbl_orderProduct op
    JOIN tbl_order o ON op.orderID = o.orderID
    GROUP BY op.productID
)
firstOrder ON firstOrder.productID = p.productID

到目前为止,我第一次尝试检索日期有效,但我不知道如何获取数量,因为我必须获取订单,然后返回 tbl_orderProduct 获取数量。
我不想通过 firstOrder.ordererdDate 通过 select 获取订单,因为它可能不是唯一的。

此外,我无法通过“左连接”中的选择传递 orderID,因为我还必须将其添加到“分组依据”中,并且它会为包含该产品的每个订单返回一行。 所以我必须以某种方式从第一个订单中检索 orderID 或 orderProductID。

提前致谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    假设您至少使用 SQL-Server2005,您可以使用带有 ROW_NUMBER 函数的公共表表达式:

    WITH CTE AS
    (
       SELECT p.productName, o.orderedDate, quantity
       , RN = ROW_NUMBER() OVER ( PARTITION BY p.productID ORDER BY o.orderedDate )
       FROM tbl_product p 
       INNER JOIN tbl_orderProduct op ON p.productID=op.productID
       INNER JOIN tbl_order o ON op.orderID=o.orderID
    )
    SELECT * FROM CTE WHERE RN = 1
    

    【讨论】:

    • SUM() 不是必需的,因为我只需要第一个订单的数量,但除此之外,这正是我所需要的......非常感谢! :)
    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 2017-02-18
    • 2017-04-30
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多