每组oracle中只有return个最高值

Only return the highest value in each group oracle

给定一个 table:

NAME        DATE_OCCURRED
a           2020-05-14 23:48.07
a           2020-05-14 23:48.07
a           2020-05-14 23:48.08
b           2020-05-14 23:48.08
b           2020-05-14 23:48.08
b           2020-05-14 23:48.08
b           2020-05-14 23:48.09

我想return,对于每个NAME,存在最多记录的时间;以及当时有多少条记录:

NAME       MAXCOUNT_PER_SECOND   DATE_OCCURRED
a          2                     2020-05-14 23:48.07
b          3                     2020-05-14 23:48.08

我找到了 SQL 按 DATE_OCCURRED 和 NAME:

对计数进行分组

SELECT COUNT(*) AS COUNT_PER_SECOND, NAME, DATE_OCCURRED FROM TABLE GROUP BY NAME, DATE_OCCURRED ORDER BY NAME ASC, COUNT_PER_SECOND DESC

但我现在想再次 select,只为每个名称选择最大值。我试过:

SELECT MAX(COUNT_PER_SECOND) AS MAXCOUNT_PER_SECOND, NAME FROM (the above query) GROUP BY NAME; 并且可以得到 MAXCOUNT_PER_SECONDNAME;但是一旦我尝试并得到哪个 DATE_OCCURRED 导致了 MAXCOUNT_PER_SECOND 值,我最终会在 运行 the SQL 时出现分组错误;或者我没有得到我期望的结果。

即:

SELECT MAX(COUNT_PER_SECOND) AS MAXCOUNT_PER_SECOND, NAME, DATE_OCCURRED FROM (the above query) GROUP BY NAME; -> Not a GROUP BY expression

SELECT MAX(COUNT_PER_SECOND) AS MAXCOUNT_PER_SECOND, NAME, DATE_OCCURRED FROM (the above query) GROUP BY NAME, DATE_OCCURRED ; -> 运行,但给我所有日期的结果,而不仅仅是最大值。

您可以使用聚合和 window 函数:

select name, date_occured, no_records
from (
    select 
        name, 
        date_occured, 
        count(*) no_records, 
        rank() over(partition by name order by count(*) desc) rn
    from mytable
    group by name, date_occured
) t
where rn = 1

子查询按namedate_occured进行聚合,统计每组的记录数,对name相同的记录组进行降序排列。然后外部查询过滤每个 name 的顶部记录。由于我们使用 rank(),结果集中将包含可能的顶级关系(如果您不想这样,请改用 row_number())。