使用两列的最大值保持观察

时间:2016-12-19 09:58:39

标签: sql sas

我有一张像这样的表:

ID Value1 Value2 ...
1  4      80
1  5      99
1  5      100
2  7      30
2  7      33
2  22     11

现在,我想保留所有观察结果,对于每个ID和Value1,Value2的值最高,即结果应如下所示:

ID Value1 Value2 ...
1  4      80
1  5      100
2  7      33
2  22     11

有没有人有任何想法?

最佳

7 个答案:

答案 0 :(得分:1)

使用Group By子句来实现结果:

public class User
{
    public user_info user_info { get; set; }
    public Dictionary<string, reportInfo> reports { get; set; }
}

答案 1 :(得分:1)

如果使用SAS并且想要避免使用SQL,则可以按降序对所有变量进行排序,并使用带有first.ID语句的by语句仅获取第一个值(排序后的值最高)。

proc sort data = have;
  by ID descending Value1 descending Value2 ...
run;

data want;
  set have;
  by ID;
  if first.ID;
run;

注意:根据数据的大小,由于对多列进行排序,这可能不是最有效的。

答案 2 :(得分:0)

假设支持ROW_NUMBER

select      *

from       (select      t.*
                       ,row_number() over 
                            (partition by ID,Value1 order by Value2 desc) as rn

            from        my_table 
            ) t

where       rn = 1

答案 3 :(得分:0)

只需使用Group By with Max功能

SELECT ID,  VALUE1 , MAX(VALUE2) AS VALUE2
FROM TABLE1
GROUP BY ID, VALUE1 

答案 4 :(得分:0)

使用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

答案 5 :(得分:0)

试试这个。

        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

OR

             select ID ,Value1,max(Value2)from 
            #TableName
            group by ID ,Value1

答案 6 :(得分:0)

这是SAS版本。 id中的proc summary语句将自动返回最大值。 class语句等同于group bydrop语句删除了过程中创建的自动变量(_type__freq_)。

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;