Различают похожие записи в базе данных SQL Server 2008 - PullRequest
0 голосов
/ 14 октября 2011

У меня есть база данных SQL Server 2008. В этой базе данных есть таблица Product, Order и OrderProduct. Эти три таблицы выглядят следующим образом:

Product
-------
ID
Name
Description

Order
-----
ID
OrderDate
Status

OrderProduct
------------
OrderID
ProductID
Quantity

Я пытаюсь определить три последних уникальных товара, которые заказал человек. Тем не менее, мне также нужно указать дату последнего заказа продукта. Моя проблема в том, что я продолжаю получать такой набор результатов:

банка бобов (10.10.2011) Сода (10/09/2011) Банка с фасолью (08.10.2011)

Второй «Банки с фасолью» быть не должно, потому что я уже показывал «Банку с фасолью». Мой запрос выглядит так:

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 ]

2 голосов
/ 14 октября 2011
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;
0 голосов
/ 14 октября 2011

Использовать 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()

0 голосов
/ 14 октября 2011

Попробуйте группировать как:

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 
0 голосов
/ 14 октября 2011

Вы пробовали 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...