2012-02-16 71 views
1

我需要带回只有一条记录从复制的行中的SQL Server重复数据删除记录,而不删除

我有这样

------------------------------------------- 
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在问题中的含义),您会明白我的意思。 – 2012-02-16 16:29:05

+2

+1这样一个快速恢复。 – 2012-02-16 16:30:24

+0

当第一条记录的标准变得复杂且涉及许多字段和计算时,这是一个非常好的策略。 – JeffO 2012-02-16 16:32:02

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 

OR

使用敏将让你一阶

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

这不行。订单ID是不同的。 – PHeiberg 2012-02-16 16:25:06

+0

啊,你说得对。我的眼睛在戏弄我。 – Taryn 2012-02-16 16:25:51

4

这样你就可以得到的,不仅是两行之一,而且订购的数量

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