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

维罗尼克

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

SELECT
    S.SG_HOSTCITY,
    C.COUNTRY_OLYMPIC_CODE,
    DENSE_RANK() OVER (ORDER BY to_char(S.SG_START, 'MMDD')) AS RN
FROM
    SUMMERGAMES S,
    COUNTRY C  
WHERE
    S.COUNTRY_ISOCODE = C.COUNTRY_ISOCODE
    RN = 1
ORDER BY RN;

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

有人可以帮忙吗?我不知道我在做什么错。

布莱恩·德米利亚(Brian DeMilia)

将其放入内联视图:

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_START日期的SG_HOSTCITY和COUNTRY_OLYMPIC_CODE的组合。例如,如果2002年的第一年是1/5,并且2002年的那个日期有5个这样的SG_HOSTCITY和COUNTRY_OLYMPIC_CODE值落入该日期,那么它将显示该年的所有5个,因为它将恢复联系。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章