区别于SQL Server 2008数据库中的类似记录

时间:2011-10-14 13:24:52

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

我有一个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不起作用的原因是因为订单日期不同。但是,我不确定如何解决这个问题。有人能告诉我如何解决这个问题吗?

4 个答案:

答案 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()