Дедупе записи без DELETE - PullRequest
       14

Дедупе записи без DELETE

1 голос
/ 16 февраля 2012

Мне нужно вернуть только одну из записей из дублированной строки в SQL Server

У меня есть такие данные

-------------------------------------------
CustomerID, OrderID, ProductID, Title
-------------------------------------------
1,1001,131,orange
1,1002,131,orange
-------------------------------------------

Эти строки показаны как 2 элемента, которые былизаказано одним и тем же человеком, на самом деле их всего два, как количество, выбранное в корзине, и 2 записи.

Мой вопрос: как мне извлечь только одну из этих строк?

Спасибо

Ответы [ 4 ]

5 голосов
/ 16 февраля 2012

Может быть что-то вроде этого:

Сначала несколько тестовых данных:

DECLARE @tbl TABLE(CustomerID INT,OrderID INT,ProductID INT,Title VARCHAR(100))

INSERT INTO @tbl
VALUES
    (1,1001,131,'orange'),
    (1,1002,131,'orange')

Затем запрос

;WITH CTE AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY tbl.CustomerID,tbl.ProductID,tbl.Title 
              ORDER BY tbl.OrderID) AS RowNbr,
        tbl.CustomerID,
        tbl.OrderID,
        tbl.ProductID,
        tbl.Title
    FROM
        @tbl AS tbl
)
SELECT
    *
FROM
    CTE
WHERE
    CTE.RowNbr=1
4 голосов
/ 16 февраля 2012

Таким образом вы можете получить не только одну из двух строк, но и заказанное количество

SELECT 
   CustomerID, ProductID, Title, max(OrderID) as orderID, COUNT(*) as quantity
FROM 
  TableName 
GROUP BY 
   CustomerID, 
   ProductID, 
   Title 
2 голосов
/ 16 февраля 2012

С помощью Max вы получите самый последний заказ

SELECT CustomerID, MAX(OrderId), ProductID, Title
FROM table
GROUP BY CustomerID, ProductID, Title

ИЛИ

С помощью Min вы получите первый заказ

SELECT CustomerID, MIN(OrderId), ProductID, Title
FROM table
GROUP BY CustomerID, ProductID, Title
1 голос
/ 16 февраля 2012

При условии, что это действительно то, что вам нужно, вы можете получить первый заказ каждого заказа с тем же клиентом, продуктом и названием, используя группировку и функцию MIN (MAX даст вам последний заказ):

SELECT CustomerID, MIN(OrderID) AS OrderID, ProductID, Title 
FROM MyTable
GROUP BY CustomerID, ProductID, Title

Если вы хотите количество повторяющихся заказов (это будет заказанное количество, если судить по вашему вопросу), вы можете добавить счет:

SELECT CustomerID, MIN(OrderID) AS OrderID, ProductID, Title, 
    COUNT(*) AS Quantity 
FROM MyTable
GROUP BY CustomerID, ProductID, Title
...