SQL根据其他列查询最大值

时间:2018-07-02 17:05:47

标签: sql teradata

我想要每次预订中的最高排名以及长期的特许经营权。关于如何查询此有任何想法?

id  reservation date    franch  rank
1   1           6/1/2017    1   234
2   1           6/1/2017    1   465
3   1           6/1/2017    1   851
4   1           6/1/2017    1   956
1   1           6/2/2017    2   658
2   1           6/2/2017    2   578
3   1           6/2/2017    2   578
4   1           6/2/2017    2   954
5   2           6/1/2017    1   436
6   2           6/1/2017    1   645
7   2           6/1/2017    1   854
8   2           6/1/2017    1   145
5   2           6/2/2017    3   98
6   2           6/2/2017    3   345
7   2           6/2/2017    3   867
8   2           6/2/2017    3   909

输出应该像...,但请注意,我也希望不返回多个记录,例如17年2月2日和专营权2的预订1的578。

id  reservation date    franch  rank
4   1           6/1/2017    1   956
2   1           6/2/2017    2   578
3   1           6/2/2017    2   578
7   2           6/1/2017    1   854
8   2           6/2/2017    3   909

2 个答案:

答案 0 :(得分:2)

您可以使用QUALIFY

SELECT *
FROM tab
QUALIFY RANK() OVER(PARTITION BY reservation,date,franch ORDER BY rank DESC) = 1

答案 1 :(得分:0)

在大多数数据库中,我可能会去:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.reservation = t.reservation and t2.date = t.date 
              order by t2.rank desc
              fetch first 1 row only
             );

但是我不认为Teradata支持这种结构。如果我假设您想要最高的ID,则:

select t.*
from t
where t.id = (select max(t2.id)
              from t t2
              where t2.reservation = t.reservation and t2.date = t.date 
             );

或者您可以使用qualify

select t.*
from t
qualify row_number() over (partition by reservation, date order by rank desc) = 1;

使用row_number()可确保每reservation / date排一行,因此不会重复。