SQL - 如何选择具有最大值的列的行(+按组选择)

22 浏览
0 Comments

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技巧)

目标是获得相同的答案,但按类别分组。

0
0 Comments

问题的出现原因是希望从每个类别中选择具有最高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值的行。

0
0 Comments

问题原因:用户想要选择具有最大值的列,并根据特定条件进行分组。用户使用的查询语句只返回了一个结果,但用户需要两个结果,其中一个包含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字段。

希望这对您有所帮助!

0