2014-10-29 67 views
1

在SAS中,如果我想刪除帶有重複項的排序數據,我可以使用proc sortnoduprecs選項。而nodupkey選項可以通過一些鍵列刪除SQL Server中按鍵列的重複項

e.g

proc sort data=HAVE out=WANT nodupkey;by var1, var2;run; 

在SQL Server中刪除重複的,我知道select distinct *可以產生類似proc sort noduprecs。但是如何在SAS中產生類似proc sort nodupkey;by var1, var2的輸出? (返回第一值,如果存在重複)

EDIT

通過使用概要funtion像max,重複的可被移除,而最大的那些列的在group by聲明不specifed會返回。

select key1, max(var1) as var1, key2, key3, max(var2) as var2, max(var3) as var3 
from #HAVE 
group by key1, key2, key3 

但我想要的是返回(var1,var2,var3)的第一個組合。

鑑於

key1 var1 key2 key3 var2 var3 
K1 20 K2 K3 30 BB 
K1 10 K2 K3 40 AA 

理想的輸出是

key1 var1 key2 key3 var2 var3 
K1 20 K2 K3 30 BB 

key1 var1 key2 key3 var2 var3 
K1 20 K2 K3 40 AA 
+0

說一個*** SELECT DISTINCT列1,列2 FROM表***爲你工作? – 2014-10-29 08:14:28

+0

我不需要在'select'語句中包含其他列嗎? – Lovnlust 2014-10-29 08:18:12

+1

沒有這樣的東西,作爲key1,key2,key3的第一組合。這是沒有道理的。也許如果你有一個autoincremental Id列或時間戳 – 2014-10-29 08:57:26

回答

3

根據您的評論你有一個時間戳,利用該時間戳,可以選擇的是「首先「組合key1,key2,key3

這裏是挑選鍵1,鍵2的每個組合的earliers數據集的解決方案,KEY3

;WITH CTE 
AS 
(
SELECT 
    key1, var1, key2, key3, var2, var3, 
    row_number() over (partition by key1, key2, key3 order by timestamp) rn 
FROM 
    #HAVE 
) 
SELECT 
    key1, var1, key2, key3, var2, var3 
FROM 
    CTE 
WHERE 
    rn = 1 
+0

我不明白的語法。 'row_number()是一個函數嗎?我在數據中沒有一個名爲'timestamp'的現有列。我可以使用任何函數來獲取行索引作爲'timestamp'嗎?爲什麼'; with .. as()'? – Lovnlust 2014-10-29 10:22:41

+0

@GMTG你剛剛寫到你有數據按時間戳排序。這是無法解決的,如果你沒有一個列來按>排序。數據排列在表中的順序可能不是隨機的,但不能依賴於此序列 – 2014-10-29 10:24:52

+0

不支持此處使用的一些SQL語法('row_number()','over'和'partition by')在SAS中的'proc sql'內。它可能在對另一個dbms的傳遞查詢中工作。 – user667489 2014-10-29 13:27:33