Select 列不在 group by 语句中

Select column not on a group by statement

所以,我有一个名为 RACES 的 table,其中有以下列

raceid | year | round

我想获得每年最后一场比赛的 raceid,这将在每年的圆列中具有最高值。所以我做了以下查询:

SELECT
    year,
    max(round)
FROM races
group by year
order by year;

结果是:

year    max(round)
1950    7
1951    8
1952    8
1953    9
1954    9

现在如果我这样做

SELECT * FROM RACES WHERE YEAR = 1950;

我明白了:

raceid  year    round
833     1950    1
834     1950    2
835     1950    3
836     1950    4
837     1950    5
838     1950    6
839     1950    7

由于轮数随时间变化,1951 年可能不是 7 轮而是 10 轮。所以我总是希望获得特定年份的轮数最大值,然后将其与相应的 raceid 那一轮。在这种情况下,它将是 839

由于 raceid 不在 group by 中,我无法在第一个查询中 select 它。我该怎么做?

select year, max(round) as max_round, 
       max(raceid) keep (dense_rank last order by round) as raceid
from   races
group  by year
order  by year
;

firstlast 函数的文档:

https://docs.oracle.com/database/121/SQLRF/functions074.htm#SQLRF00641

使用您发布的示例数据,这只是另一个 MAX 函数调用:

SQL> with races (raceid, year, round) as
  2    (select 700, 1940, 1 from dual union all
  3     select 701, 1940, 2 from dual union all
  4     --
  5     select 833, 1950, 1 from dual union all
  6     select 838, 1950, 6 from dual union all
  7     select 839, 1950, 7 from dual
  8    )
  9  select year,
 10        max(round) max_round,
 11        max(raceid) max_raceid
 12  from races
 13  group by year;

      YEAR  MAX_ROUND MAX_RACEID
---------- ---------- ----------
      1940          2        701
      1950          7        839

SQL>

但是,如果 RACEID 不是 MAXROUND,那么您可以将当前查询用作子查询(或 CTE)并将其与“原创" table:

SQL> with races (raceid, year, round) as
  2    (select 700, 1940, 1 from dual union all
  3     select 701, 1940, 2 from dual union all
  4     --
  5     select 900, 1950, 1 from dual union all  --> 900 is MAX for year 1950
  6     select 838, 1950, 6 from dual union all
  7     select 839, 1950, 7 from dual
  8    ),
  9  mrid as
 10    (select year,
 11            max(round) max_round
 12     from races
 13     group by year
 14    )
 15  select m.year,
 16         m.max_round,
 17         r.raceid
 18  from mrid m join races r on r.year = m.year and r.round = m.max_round;

      YEAR  MAX_ROUND     RACEID
---------- ---------- ----------
      1940          2        701
      1950          7        839

SQL>