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;