2012-02-16 5 views
1

мне нужно вернуть только одну из записей с дублированным строки в SQL ServerDeDupe записи без УДАЛИТЬ

Я такие данные

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

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

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

Благодаря

ответ

5

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

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

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 
+0

Я не думаю, что это приведет к желаемым результатам. Поскольку вы разбиваете на каждый столбец, 'iRank' будет * ВСЕГДА * быть' 1'. Исправьте ваши данные образца (измените второй «OrderID» на «1002», например, чтобы соответствовать тому, что было у OP в вопросе), и вы поймете, что я имею в виду. –

+2

+1 для такого быстрого восстановления. –

+0

Это очень хорошая стратегия, когда критерии для первой записи усложняются и включают в себя множество полей и вычислений. – JeffO

1

При условии, что это действительно то, что вы хотите, вы можете получить первый заказ каждого заказа с тем же клиентом, продуктом и названием, используя группировку и функцию 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 
2

Использование M Топор поможет вам самый последний заказ

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

ИЛИ

Использование Мин получите вы первый заказ

SELECT CustomerID, MIN(OrderId), ProductID, Title 
FROM table 
GROUP BY CustomerID, ProductID, Title 
+0

Это не будет делать. Идентификаторы orderID различны. – PHeiberg

+0

ах, ты прав. Мои глаза играют на меня. – Taryn

4

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

SELECT 
    CustomerID, ProductID, Title, max(OrderID) as orderID, COUNT(*) as quantity 
FROM 
    TableName 
GROUP BY 
    CustomerID, 
    ProductID, 
    Title