SQL - 如何选择具有最大值的列的行(+按组选择)
SQL - 如何选择具有最大值的列的行(+按组选择)
我正在基于这里引用的问题构建:
日期 值 18/5/2010, 1 pm 40 18/5/2010, 2 pm 20 18/5/2010, 3 pm 60 18/5/2010, 4 pm 30 18/5/2010, 5 pm 60 18/5/2010, 6 pm 25
我需要查询具有最大值的行(即60)。所以,我们得到了两行。从中,我需要在那一天中具有最低时间戳的行(即18/5/2010, 3 pm -> 60)
我们如何在Sujee提供的答案的基础上进行改进:
select high_val, my_key from (select high_val, my_key from mytable where something = 'avalue' order by high_val desc) where rownum <= 1
如果数据有第三列"category"。
日期 值 类别 18/5/2010, 1 pm 40 1 18/5/2010, 2 pm 20 1 18/5/2010, 3 pm 60 1 18/5/2010, 4 pm 30 2 18/5/2010, 5 pm 60 2 18/5/2010, 6 pm 25 2
FYI - 我在使用Oracle,并尝试避免嵌套连接(因此使用了rownum技巧)
目标是获得相同的答案,但按类别分组。
问题的出现原因是希望从每个类别中选择具有最高high_val值的行。解决方法是使用row_number()函数根据high_val值对每行进行排名,然后只选择排名最高的行,即rn = 1。
以下是解决方法的SQL代码:
select * from ( select row_number() over (partition by category order by high_val desc, date asc) rn, * from mytable where something = 'avalue' ) t1 where rn = 1
这段代码的作用是先按照category进行分组,然后根据high_val值降序排列,如果high_val值相同,则按照date升序排列。最后,使用row_number()函数为每个行分配一个排名,排名最高的行的rn值为1,只选择rn值为1的行。
通过这种方法,我们可以选择每个类别中具有最高high_val值的行。
问题原因:用户想要选择具有最大值的列,并根据特定条件进行分组。用户使用的查询语句只返回了一个结果,但用户需要两个结果,其中一个包含category字段。
解决方法:在order by子句中添加一个额外的键,并在子查询中选择category字段。
以下是解决方法的完整代码:
select high_val, my_key, category from ( select high_val, my_key, category from mytable where something = 'avalue' order by high_val desc, date asc ) where rownum = 1;
以上代码将返回具有最大high_val值的行,并根据date字段进行排序。如果需要,还会返回category字段。
希望这对您有所帮助!