函数返回上次记录

时间:2018-01-23 03:16:07

标签: oracle plsql

我不经常使用ORACLE PL / SQL,但我需要了解该函数创建的其他内容是什么 在我之前的公司是错误的,因为它没有返回我被告知的最新记录。我在其他一些论坛上发现了他们的问题 建议使用max(dateColumn)而不是" row_numer = 1"例如,但不太确定如何以及在何处加入它。

- 知道 - 我们使用Oracle版本12, CustomObjectTypeA是由一些不再在此处的旧员工定义的自定义Oracle OBJECT TYPE, V_OtherView属于Table_Mnd类型,由一些不再在这里的老员工定义, V_ABC_123是一个不再在这里的老员工创建的视图。

CREATE OR REPLACE FUNCTION F_TABLE_APPROVED (NUMBER_F_UPD number, NUMBER_F_GET VARcHAR2)
RETURN Table_Mnd
IS
V_OtherView Table_Mnd
BEGIN
SELECT CustomObjectTypeA (FromT.NUMBER_F, 
        FromT.OP_CODE, 
        FromT.CATG_CODE, 
        FromT.CATG_NAME, 
        FromT.CATG_SORT,
        FromT.ORG_CODE,
        FromT.ORG_NAME
        FromT.DATA_ENTRY_VALID, 
        FromT.NUMBER_RECEIVED, 
        FromT.YEAR_1, 
        FromT.YEAR_2)
BULK COLLECT INTO V_OtherView
FROM (SELECT NUMBER_F,
        OP_CODE,
        CATG_CODE,
        CATG_NAME,
        CATG_SORT,
        ORG_CODE,
        ORG_NAME
        DATA_ENTRY_VALID,
        NUMBER_RECEIVED,
        YEAR_1,
        YEAR_2, 
        ROW_NUMBER() OVER (PARTITION BY BY ORG_CODE ORDER BY NUMBER_RECEIVED DESC, LOAD_DATE DESC) AS ROW_NUMBER
      FROM V_ABC_123
      WHERE NUMBER_F = NUMBER_F_UPD AND DATA_ENTRY_VALID <> 'OnGoing'
     AND LOAD_DATE >= (SELECT sysdate-10 FROM dual)
     AND LOAD_DATE <= (SELECT DISTINCT LOAD_DATE 
               FROM V_ABC_123 
               WHERE NUMBER_RECEIVED = NUMBER_F_GET)) FromT
WHERE FromT.ROW_NUMBER=1;
RETURN V_OtherView;
END F_TABLE_APPROVED;

1 个答案:

答案 0 :(得分:0)

查询的重要部分是:

SELECT ...
FROM (select ...,
             ROW_NUMBER()
             OVER (PARTITION BY ORG_CODE
                   ORDER BY NUMBER_RECEIVED DESC,
                   LOAD_DATE DESC) AS ROW_NUMBER
      ...) FromT
WHERE FromT.ROW_NUMBER = 1;

&#34; ROW_NUMBER&#34;列根据以下窗口子句计算:

PARTITION BY ORG_CODE
ORDER BY NUMBER_RECEIVED DESC, LOAD_DATE DESC

这意味着对于每个ORG_CODE,它将按NUMBER_RECEVED,LOAD_DATE降序排列所有记录。请注意,如果列是Oracle DATE,则它们只能精确到最接近的秒;因此,如果有多个记录的日期/时间完全相同的1秒间隔,则此排序顺序将不会保证唯一。因此,ROW_NUMBER的逻辑将任意挑选其中一个(即先发生的任何记录)并为其分配值#34; 1&#34;这将被视为&#34;最新& #34 ;.后续执行相同的SQL 可以(理论上)返回不同的记录。

可疑部分是NUMBER_RECEIVED,听起来像是一个数字,而不是约会?通过这种方式排序意味着具有最高NUMBER_RECEIVED的记录将是首选。这是故意的吗?

我不确定为什么PARTITION存在,这会导致查询返回一个&#34;最新的&#34;记录它找到的ORG_CODE的每个值。我只能假设这是故意的。

问题是查询只能确定&#34;最新记录&#34;以及它可以基于提供给它的数据。在这种情况下,数据可能不够精细,无法确定哪条记录是实际的&#34;最新的&#34;记录。