oracle 我怎么能把最新的记录的日期,他们有?

kgsdhlau  于 2023-08-04  发布在  Oracle
关注(0)|答案(3)|浏览(120)

在我的表中,我有一些重复的记录,我想取具有最新日期的记录。这是因为我使用了一个游标,游标返回给我重复的记录和我必须插入到表中的信息,但我不能这样做,因为重复的记录。这可能是一个函数错误,因为我使用了其中的4个,idk。我不知道我能做些什么来解决它。对不起我的英语。
这是我尝试使用的程序:

CREATE OR REPLACE PROCEDURE PR_INSERT_DATOS IS
CURSOR CUR_DATOS IS
    SELECT DISTINCT NUMRUN AS NUMRUN, PNOMBRE||' '||SNOMBRE||' '||APATERNO||' '||AMATERNO AS NOMBRE
    FROM ANTECEDENTES_PERSONALES
    ORDER BY NUMRUN;
    V_PTJE_ANNOS_EXP NUMBER(8);
    V_PTJE_HORAS_TRAB NUMBER(8);
    V_PTJE_ZONA NUMBER(8);
    V_PTJE_RANKING NUMBER(8);
BEGIN
    EXECUTE IMMEDIATE('TRUNCATE TABLE DETALLE_PUNTAJE_POSTULACION');

        FOR REG_DATOS IN CUR_DATOS LOOP
            V_PTJE_ANNOS_EXP:=FN_PTJ_ANNOS_EXP(REG_DATOS.NUMRUN);
            V_PTJE_HORAS_TRAB:=FN_PTJE_HORAS(REG_DATOS.NUMRUN);
            V_PTJE_ZONA:=FN_PTJE_ZONA(REG_DATOS.NUMRUN);
            V_PTJE_RANKING:=FN_PTJE_RANKING(REG_DATOS.NUMRUN);
            INSERT INTO DETALLE_PUNTAJE_POSTULACION VALUES (REG_DATOS.NUMRUN, REG_DATOS.NOMBRE, V_PTJE_ANNOS_EXP,
            V_PTJE_HORAS_TRAB, V_PTJE_ZONA, V_PTJE_RANKING, 0, 0);
            END LOOP;

END;

字符串
这就是我犯的错误

01422. 00000 -  "exact fetch returns more than requested number of rows"
*Cause:    The number specified in exact fetch is less than the rows returned.
*Action:   Rewrite the query or change number of rows requested

eyh26e7m

eyh26e7m1#

您可以使用如下所示的内部查询这样的解决方案

SELECT OTHER_COLS,MAX(DATE_COL) AS DATE_COL FROM SCHEMA.TABLE_NAME
GROUP BY OTHER_COLS

字符串
并使用它与OTHER_COLS AND DATE_COL上的同一个表进行内部联接,以获取要插入到第二个表中的列

ryevplcw

ryevplcw2#

你发布的代码不能返回TOO_MANY_ROWS,所以我怀疑它(至少)是关于你调用的函数之一。你应该
1.仔细检查错误信息;上面到底写了什么?哪个过程/函数引发了该错误,在哪一行?Oracle显示该信息
1.修复它,使其不会引发错误
至于获取属于最后日期的行的方法,有几种方法。
让我们假设您的表看起来像这样(我设置日期格式,以便您知道它代表什么;你不必这样做):

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select * from your_table order by nombre, datum desc;

    NOMBRE DATUM
---------- ----------
         1 10.07.2023  --> last date for NOMBRE = 1
         1 21.06.2023
         2 13.02.2023  --> last (and only) date for NOMBRE = 2

字符串
一种选择是使用一个简单的max聚合函数:

SQL> select nombre, max(datum) datum from your_table group by nombre;

    NOMBRE DATUM
---------- ----------
         1 10.07.2023
         2 13.02.2023


这应该足够你现在所做的了。
但是,如果你想使用第二高的日期值,请注意,你可以使用分析函数,例如row_number-按nombre划分行,按datum降序排序,并提取排名最高的行(rn = 1):

SQL> with temp as
  2    (select nombre, datum,
  3       row_number() over (partition by nombre order by datum desc) rn
  4     from your_table
  5    )
  6  select nombre, datum
  7  from temp
  8  where rn = 1;

    NOMBRE DATUM
---------- ----------
         1 10.07.2023
         2 13.02.2023


如果你想取第二个最高值,你可以将第8行修改为rn = 2
另一个可能有用的分析函数是rank-如果有更多的行具有相同的datum值,您将获得所有这些结果。在你的情况下很可能不是这样。

oxiaedzo

oxiaedzo3#

您不需要游标或循环,可以在单个SQL语句中完成:

CREATE OR REPLACE PROCEDURE PR_INSERT_DATOS
IS
BEGIN
  DELETE FROM DETALLE_PUNTAJE_POSTULACION;

  INSERT INTO DETALLE_PUNTAJE_POSTULACION
  SELECT numrun,
         nombre,
         FN_PTJ_ANNOS_EXP(NUMRUN) AS annos_exp,
         FN_PTJE_HORAS(NUMRUN) AS horas,
         FN_PTJE_ZONA(NUMRUN) AS zona,
         FN_PTJE_RANKING(NUMRUN) AS ranking,
         0,
         0
  FROM   (
    SELECT numrun,
           PNOMBRE||' '||SNOMBRE||' '||APATERNO||' '||AMATERNO AS nombre,
           ROW_NUMBER() OVER (
             PARTITION BY columns_you_want_to_group_by
             ORDER BY your_date_column DESC
           ) AS rn
    FROM   ANTECEDENTES_PERSONALES
  )
  WHERE  rn = 1;
END;
/

字符串
您没有说明希望按哪些列分组,也没有说明希望采用最新值的日期列的名称,因此PARTITION BYORDER BY子句留给您完成。

相关问题