2013-06-21 53 views
3

的SQL Server 2008 R2(SP2)10.50.4263從COL1刪除重複時在COL2條件滿足

我有在COL2第一次購買者(FTB)在COL1申請號以及指示器(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 

我一直在嘗試使用分區,但......不是任何運氣。桌子提供給我,我無法改變它。這需要在sql中完成,而不是excel。我已經嘗試了一百萬個排列,甚至自己加入來解決這個問題。卡住。

某種靈魂可以指路嗎?

+0

演示是否也有一個ID列? – JBrooks

回答

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; 

就是這樣。

+0

OP正在尋找清理('delete')語句。 –

+0

@juergen d OP在哪裏陳述?事實上他說他不能更改源表... – Squid

+0

你是對的。我錯過了。從標題拿來。 –

0

你可以使用在FTB與一組結合的最大骨料通過在應用程序列:

Select application, Max(ftb) from yourtable group by application; 
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) 
0

要返回列「application」列的分區內的行的序列號,請使用排列函數ROW_NUMBER和列「ftb」上的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