如何基于分析函数Oracle SQL中的值选择表

如何基于分析函数Oracle SQL中的值选择表,sql,oracle,Sql,Oracle,我有一个日期列表,我想找出哪一个是一年中最早出现的,我使用了密集的秩函数来只提取日期和月份,但我不能让它返回所有等于1的值(可能有多个最早的日期,而不仅仅是一个) 刚刚吐出00933。00000-“SQL命令未正确结束” 有人能帮忙吗?我不知道我做错了什么。将其放入内联视图: select SG_HOSTCITY, COUNTRY_OLYMPIC_CODE from (SELECT S.SG_HOSTCITY, C.COUNTRY_OLYMPIC_CODE,

我有一个日期列表,我想找出哪一个是一年中最早出现的,我使用了密集的秩函数来只提取日期和月份,但我不能让它返回所有等于1的值(可能有多个最早的日期,而不仅仅是一个)

刚刚吐出00933。00000-“SQL命令未正确结束”


有人能帮忙吗?我不知道我做错了什么。

将其放入内联视图:

select SG_HOSTCITY, COUNTRY_OLYMPIC_CODE
  from (SELECT S.SG_HOSTCITY,
               C.COUNTRY_OLYMPIC_CODE,
               DENSE_RANK() OVER(ORDER BY to_char(S.SG_START, 'MMDD')) AS RN
          FROM SUMMERGAMES S
          join COUNTRY C
            on S.COUNTRY_ISOCODE = C.COUNTRY_ISOCODE)
 WHERE RN = 1
不能使用WHERE子句在同一查询中筛选分析函数的输出值。您必须将其放入子查询中。以上内容与当前查询相同,但没有语法错误

然而,我不知道它是否真的能给你预期的输出。我也可以尝试:

select *
  from (SELECT S.SG_HOSTCITY,
               C.COUNTRY_OLYMPIC_CODE,
               DENSE_RANK() OVER( partition by TRUNC(S.SG_START, 'YYYY')
                                  order BY TRUNC(S.SG_START)              ) AS RN
          FROM SUMMERGAMES S
          join COUNTRY C
            on S.COUNTRY_ISOCODE = C.COUNTRY_ISOCODE)
 WHERE RN = 1
这将为您提供与每年相关的第一个SG_开始日期的SG_主办城市和国家/地区奥运会代码的组合。例如,如果2002年的第一年是1/5,并且2002年有5个这样的SG_HOSTCITY和COUNTRY_OLYMPIC_CODE值落在该日期,这将显示该年的所有5个值,因为这将恢复联系

不同的是,排名上升,然后在每年的变化中重新开始,而不是在所有年份(注意划分)


我认为上面的第二个查询是您真正想要的。

错误可能会误导您。你遗漏了WHERE子句中的AND。。但仍然会得到RN-无效标识符。。因为,您不能在WHERE条件中引用列别名。它只能按我想要的顺序排列。我不知道内联视图。非常感谢!很好地抓住了隔板。我建议使用TRUNC(S.SG_START,'YYYY')而不是to_char,如果需要忽略一天内的时间,只需在S.SG_START或TRUNC(S.SG_START)上下单即可。是否仍然可以在表中不显示RN的情况下执行此操作?@veronik是的,您可以在内联视图上方指定字段名称(而不是使用*表示内联视图中所有列的选择).我只是将答案改为选择除RN@used_by_already同意,只是将答案改为使用trunc。就sg_开始而言,我不知道这两种方式,因此我也使用trunc,如果在我的示例中,下午4点的1/5应与下午7点的1/5相同(1/5是特定年份中最早的一个)正如你所注意到的,这会起作用,维罗尼克:只要确保根据你的意图截断它或不截断它。
select *
  from (SELECT S.SG_HOSTCITY,
               C.COUNTRY_OLYMPIC_CODE,
               DENSE_RANK() OVER( partition by TRUNC(S.SG_START, 'YYYY')
                                  order BY TRUNC(S.SG_START)              ) AS RN
          FROM SUMMERGAMES S
          join COUNTRY C
            on S.COUNTRY_ISOCODE = C.COUNTRY_ISOCODE)
 WHERE RN = 1