当满足col2中的条件时,从col1中删除重复项

时间:2013-06-21 00:27:24

标签: sql sql-server-2008-r2

SQL Server 2008 R2(SP2)10.50.4263

我在col1中有应用程序编号,在col2中有第一次购买者(ftb)的指示符(0或1)。每个申请可以有1或2个申请人。对于有两个申请人的申请,我得到两个申请条目:

application  ftb
-----------  ---
1234          0
12345         0
12345         1
2345          1
23456         0
23456         0

所需的结果是每个独特的应用程序和ftb。如果应用程序有多个ftb值...取最高值(它始终为0或1)。

我想看到这个:

application  ftb
-----------  ---
1234          0
12345         1
2345          1
23456         0

我一直在尝试使用PARTITION但是......没有运气。该表是提供给我的,我无法改变它。这需要在sql中完成而不是excel。我已经尝试了一百万个排列,甚至自我加入来解决这个问题。卡住。

某种灵魂可以指明道路吗?

4 个答案:

答案 0 :(得分:4)

SELECT
application,
MAX(ftb) AS ftb
FROM
yourTable
GROUP BY application

我理解你的问题就像你只想在表中所需的输出中显示行并删除其他行,对吧?实现这一目标的最简单方法是使用临时表。

SELECT
application,
MAX(ftb) AS ftb
INTO #yourTempTable
FROM
yourTable
GROUP BY application;

然后通过

删除所有其他行
DELETE FROM yourTable WHERE application IN (SELECT DISTINCT application FROM #yourTempTable)

最后再次从临时表中插入表格。

INSERT INTO yourTable (application, ftb) 
SELECT application, ftb FROM #yourTempTable;

就是这样。

答案 1 :(得分:0)

您可以在应用程序列上使用ftb上的max aggregate和group by:

Select application, Max(ftb) from yourtable group by application;

答案 2 :(得分:0)

假设您还有一个ID列:

- 删除所有也有1

的零
DELETE FROM yourTable
WHERE ftb = 0 
AND application IN
(SELECT s.application
FROM yourTable AS s
WHERE s.ftb = 1)

- 每个应用程序只保留最多的重新发送

DELETE FROM yourTable
WHERE ID NOT IN 
(SELECT MAX(s.ID)
FROM yourTable AS s
GROUP BY s.application)

答案 3 :(得分:0)

要返回“application”列的分区中行的序列号,请在“ftb”列上使用排序函数ROW_NUMBER和ORDER BY子句。所以你可以删除所有重复的行

 ;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER(PARTITION BY application ORDER BY ftb DESC) AS rn
  FROM dbo.YourTable
  )
  DELETE cte
  WHERE rn > 1

请参阅SQLFiddle

上的演示