每组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_SECOND
和 NAME
;但是一旦我尝试并得到哪个 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
子查询按name
和date_occured
进行聚合,统计每组的记录数,对name
相同的记录组进行降序排列。然后外部查询过滤每个 name
的顶部记录。由于我们使用 rank()
,结果集中将包含可能的顶级关系(如果您不想这样,请改用 row_number()
)。
给定一个 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_SECOND
和 NAME
;但是一旦我尝试并得到哪个 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
子查询按name
和date_occured
进行聚合,统计每组的记录数,对name
相同的记录组进行降序排列。然后外部查询过滤每个 name
的顶部记录。由于我们使用 rank()
,结果集中将包含可能的顶级关系(如果您不想这样,请改用 row_number()
)。