从最早的日期开始选择行

时间:2012-07-27 15:09:45

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

我需要所有产品的清单,其中包含2个列,其中包含首次订购产品的日期以及此产品的订购数量。

结构:
tbl_product
- productID
- productName

tbl_orderProduct
- orderProductID
- orderID
- productID
- 数量

tbl_order
- orderID
- orderedDate

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选择订单,因为它有可能不是唯一的。

此外,我无法通过我的'Left Join'中的select传递orderID,因为我还必须在'Group By'中添加它然后它将为包含该产品的每个订单返回一行。 所以我不得不从第一个订单中检索orderID或orderProductID。

提前致谢!

1 个答案:

答案 0 :(得分:0)

假设您至少使用SQL-Server2005,则可以使用带有ROW_NUMBER函数的common-table-expression:

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