如何通过 Oracle 中的 SQL 查询找到每个 id 的 TOP/MAX 值?

Posted

技术标签:

【中文标题】如何通过 Oracle 中的 SQL 查询找到每个 id 的 TOP/MAX 值?【英文标题】:How find TOP/MAX value for each id via SQL query in Oracle? 【发布时间】:2020-11-19 23:13:13 【问题描述】:

如何使用查询来查找每个标识符(不是唯一的)的最大值? 我的桌子:

id      date      repeat_cycle
8    30.07.2020      0
4    28.04.2020      1
4    28.04.2020      0
15   01.01.2020      9
15   24.12.2019      8
15   23.12.2019      7
1    20.12.2019      5
15   19.12.2019      6
1    19.12.2019      4

我想要每个 id 的最大值(它在 repeat_cycle 中的最大数字)。 我的 SQL 查询是错误的,我不知道为什么。有人会建议如何修复它或其他查询。

SELECT * FROM (
        SELECT 
         id,
         date,
         repeat_cycle
        FROM table t1
           order by repeat_cycle desc
        ) t1
and rownum=1;

【问题讨论】:

也指定预期结果。 【参考方案1】:

我建议您不要使用“日期”之类的关键字或“表格”之类的表格来调用您的列

select t1.id, t1.date_c, t1.repeat_cycle      
from table_t t1
where (t1.id, t1.repeat_cycle) in (select t2.id, max(t2.repeat_cycle)
                                   from table_t t2
                                   group by t2.id);

Here is a demo

【讨论】:

【参考方案2】:

你可以使用row_number()

select id, date, repeat_cycle from
(select id, date, repeat_cycle, row_number() over(partition by id order by repeat_cycle desc) as rnk from table_name)
qry where rnk = 1;

【讨论】:

【参考方案3】:

您可以使用max()group by

select
    t.id,
    max(t.repeat_cycle)
from
    table t
group by
    t.id

table 是你的真实表名。

【讨论】:

【参考方案4】:

您可以使用分析函数:

select *
from (
    select 
        t.*, 
        row_number() over(partition by id order by repeat_cycle desc) rn
    from mytable t
) t
where rn = 1

或者,如果表中只有三列,keep 语法可能是合适的:

select
    id,
    max(date) keep(dense_rank first order by repeat_cycle desc) date,
    max(repeat_cycle) repeat_cycle
from mytable

【讨论】:

以上是关于如何通过 Oracle 中的 SQL 查询找到每个 id 的 TOP/MAX 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何清除Oracle中的所有缓存项

通过 Oracle SQL 返回输入字符串中出现的最大字符

Oracle 中最耗时的 5 个 SQL 查询

Apex Oracle 中的 SQL 多对多查询

SQL查询从特定列中的每个字段中删除某些文本 - Oracle SQL

如何通过 SQL 查询找到组结果的平均值?