0

我已经坚持了很长时间,我无法在网上任何地方找出/找到答案。

所以到目前为止我有这个代码:

select c.country_olympic_name, 
       max(sg_start) 
  from summergames a, 
       country c
 where a.country_isocode = c.country_isocode
 group by c.country_isocode
HAVING max(sg_start) = (select max(sg_start) 
                          from summergames 
                         group by country_isocode)
 order by c.country_isocode;

它需要做的是找出比赛的最早开始日期。

我让它工作,但是一旦我添加了country_olympic_name它在不同的表中,sg_start它就会给我这个错误:

ORA-00979: 不是 GROUP BY 表达式
00979. 00000 - “不是 GROUP BY 表达式”

4

3 回答 3

1

如果您只想要最旧/最新的日期,请使用简单的聚合 MIN(sg_date)。

但是,如果您想要该日期的所有列,则必须切换到 OLAP 函数:

SELECT *
FROM 
 (
   SELECT *,
      ROW_NUMBER()
      OVER (-- when you want the earliest date per country: PARTITION BY c.country_isocode
            ORDER BY sg_start) AS rn -- use DESC for newest date
   FROM summergames a, country c
   WHERE a.country_isocode = c.country_isocode
 ) dt 
WHERE rn = 1
ORDER BY c.country_isocode;
于 2013-09-15T13:01:15.520 回答
0

这是做你想做的吗?

select c.country_olympic_name, min(sg_start) 
from summergames a join
     country c
    on a.country_isocode = c.country_isocode
group by c.country_olympic_name
于 2013-09-15T12:46:24.680 回答
0

SELECT 中不是聚合的任何字段也必须在 GROUP BY 中。否则,SQL 引擎不知道如何按非聚合进行分组。您可以将 SQL 更改为以下内容:

select c.country_olympic_name, max(sg_start) 
  from summergames a, country c
 where a.country_isocode = c.country_isocode
 group by c.country_isocode, c.country_olympic_name
having max(sg_start) = ( select max(sg_start) 
                           from summergames 
                          group by country_isocode)
order by c.country_isocode;
于 2013-09-15T12:47:04.820 回答