2014-10-29 63 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