Sql 两列最大值保持观测值
我有一张像这样的桌子:Sql 两列最大值保持观测值,sql,sas,Sql,Sas,我有一张像这样的桌子: ID Value1 Value2 ... 1 4 80 1 5 99 1 5 100 2 7 30 2 7 33 2 22 11 现在,我想保留所有观察结果,其中对于每个ID和值1,值2的值最高,即结果如下所示: ID Value1 Value2 ... 1 4 80 1 5 100 2 7 33 2 22 11 有人有什么想法吗 最佳假设支持行号 se
ID Value1 Value2 ...
1 4 80
1 5 99
1 5 100
2 7 30
2 7 33
2 22 11
现在,我想保留所有观察结果,其中对于每个ID和值1,值2的值最高,即结果如下所示:
ID Value1 Value2 ...
1 4 80
1 5 100
2 7 33
2 22 11
有人有什么想法吗
最佳假设支持行号
select *
from (select t.*
,row_number() over
(partition by ID,Value1 order by Value2 desc) as rn
from my_table
) t
where rn = 1
只需使用GROUPBY和Max函数
SELECT ID, VALUE1 , MAX(VALUE2) AS VALUE2
FROM TABLE1
GROUP BY ID, VALUE1
使用Group By子句实现您的结果:
SELECT ID ,Value1 ,MAX(Value2)
FROM Your_Table
GROUP BY ID ,Value1
使用group by和加入子选择可以让您
SELECT *
FROM the_table t1
JOIN (
SELECT id, value1, MAX(value2) AS value2
FROM the_table
GROUP BY ID ,value1
) t2 ON t1.id = t2.id
AND t1.value1 = t2.value1
AND t1.value2 = t2.value2
试试这个
select ID ,value1,Value2 from
( select ID ,value1,Value2,row_number() over
( partition by ID,Value1 order by Value2 desc )as rnk
from
#TableName
)a where rnk =1
或
这是SAS版本。
proc summary
中的id
语句将自动返回最大值。class
语句相当于groupby
。drop
语句去除了过程中创建的自动变量(\u type\u
,\u freq\u
)
data have;
input ID Value1 Value2;
datalines;
1 4 80
1 5 99
1 5 100
2 7 30
2 7 33
2 22 11
;
run;
proc summary data=have nway;
class id value1;
id value2;
output out=want (drop=_:);
run;
如果使用SAS并希望避免使用SQL,则可以将所有变量按降序排序,并将by语句与first.ID语句一起使用,以仅获取第一个值(排序后将是最高值) 注意:根据数据的大小,这可能不是最有效的,因为要对多个列进行排序。注意值2(1)后的3点(…)组是每个ID+值1(2)注意值2后的3点(…)
data have;
input ID Value1 Value2;
datalines;
1 4 80
1 5 99
1 5 100
2 7 30
2 7 33
2 22 11
;
run;
proc summary data=have nway;
class id value1;
id value2;
output out=want (drop=_:);
run;
proc sort data = have;
by ID descending Value1 descending Value2 ...
run;
data want;
set have;
by ID;
if first.ID;
run;