我有一个SQL Server 2008数据库。该数据库有一个名为Product,Order和OrderProduct的表。这三个表如下所示:
Product
-------
ID
Name
Description
Order
-----
ID
OrderDate
Status
OrderProduct
------------
OrderID
ProductID
Quantity
我正在尝试识别用户订购的最后三个唯一产品。但是,我还需要包括订购产品的最后日期。我的问题是我一直得到这样的结果集:
Can of Beans(10/10/2011) 苏打水(10/09/2011) 豆罐头(10/08/2011)
第二个“Can of Beans”不应该在那里,因为我已经展示了“Can of Beans”。我的查询如下:
SELECT TOP 3 DISTINCT
p.[Name],
o.[OrderDate]
FROM
[Product] p,
[Order] o
[OrderProduct] l
WHERE
l.[ProductID]=p.[ID] and
l.[OrderID]=o.[ID]
ORDER BY
o.[OrderDate] DESC
我明白DISTINCT不起作用的原因是因为订单日期不同。但是,我不确定如何解决这个问题。有人能告诉我如何解决这个问题吗?
答案 0 :(得分:2)
WITH cteProducts AS (
SELECT p.Name, o.OrderDate,
ROW_NUMBER() OVER(PARTITION BY p.Name ORDER BY o.OrderDate DESC) as RowNum
FROM Product p
INNER JOIN OrderProduct op
ON p.ID = op.ProductID
INNER JOIN Order o
ON op.OrderID = o.ID
)
SELECT TOP 3 Name, OrderDate
FROM cteProducts
WHERE RowNum = 1
ORDER BY OrderDate DESC;
答案 1 :(得分:0)
您是否尝试过GROUP BY
?
SELECT TOP 3
p.[Name],
max(o.[OrderDate])
FROM
[Product] p,
[Order] o
[OrderProduct] l
WHERE
l.[ProductID]=p.[ID] and
l.[OrderID]=o.[ID]
GROUP BY p.[Name]
ORDER BY
max(o.[OrderDate]) DESC
答案 2 :(得分:0)
尝试分组:
SELECT TOP 3
p.[Name],
MAX(o.[OrderDate])
FROM
[Product] p,
[Order] o
[OrderProduct] l
WHERE
l.[ProductID]=p.[ID] and
l.[OrderID]=o.[ID]
GROUP BY p.[Name]
ORDER BY
MAX(o.[OrderDate]) DESC
答案 3 :(得分:0)
使用GROUP BY
...因为我使用过SQL Server已经有一段时间了,但查询看起来像这样:
SELECT TOP 3
p.[Name],
max(o.[OrderDate]) AS MostRecentOrderDate
FROM
[Product] p,
[Order] o
[OrderProduct] l
WHERE
l.[ProductID]=p.[ID] and
l.[OrderID]=o.[ID]
GROUP BY p.[Name]
ORDER BY
MostRecentOrderDate DESC
或者要首次订购该产品时,请选择min()
代替max()