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
;
first
和 last
函数的文档:
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
不是 MAX
和 ROUND
,那么您可以将当前查询用作子查询(或 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>
所以,我有一个名为 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
;
first
和 last
函数的文档:
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
不是 MAX
和 ROUND
,那么您可以将当前查询用作子查询(或 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>