Oracle 12c-sql用于查找顺序错误的行

Oracle 12c-sql用于查找顺序错误的行,sql,oracle,select,oracle12c,Sql,Oracle,Select,Oracle12c,我有一个包含以下列的表: FILE_NAME VARCHAR2(30); STATUS VARCHAR2(2); DEPT_ID NUMBER; DEPT_SUB_ID NUMBER; CREATE_DATE DATE; 样本数据: FILE_NAME STATUS DEPT_ID DEPT_SUB_ID CREATE_DATE --------- ------- -------- ----------- ------

我有一个包含以下列的表:

FILE_NAME VARCHAR2(30);
STATUS VARCHAR2(2);
DEPT_ID NUMBER;
DEPT_SUB_ID NUMBER;
CREATE_DATE DATE;
样本数据:

FILE_NAME                 STATUS  DEPT_ID   DEPT_SUB_ID  CREATE_DATE
---------                 ------- --------  -----------  ----------
TEST_20180806222127       C       1         10           07-AUG-18 01.04.47.821795000 AM
TEST_20180806221940       C       1         10           07-AUG-18 04.12.20.957400000 AM
TEST_20180806221733       C       1         10           07-AUG-18 03.35.27.809494000 AM
TEST_20180805202020       C       1         20           06-AUG-18 02.24.47.821795000 AM
TEST_20180805201640       C       1         20           06-AUG-18 00.42.20.957400000 AM
TEST_20180805201530       C       1         20           06-AUG-18 03.55.27.809494000 AM
文件名
由以下部分组成:
我想为每个
DEPT\u ID
DEPT\u SUB\u ID
写一个查询,根据
文件名
创建日期
字段上的
确定哪些状态为
的文件是无序创建的。在本例中,对于
DEPT\u SUB\u ID=10
,文件
TEST\u 201806222127
是基于文件名上的
DATE\u TIME
在其他2个文件之前创建的,因此我只需要在
DEPT\u SUB\u ID=10
的结果中返回此文件名。对于
DEPT\u SUB\u ID=20
,结果应该包含
TEST\u 20180805201640
TEST\u 2018080520202
,因为这两个都是在
TEST\u 20180805201530
之前创建的,这被认为是无序的


查询的预期结果将输出在运行顺序之前创建的所有文件名。

您可以为每行分配两个排名,一个基于嵌入文件名的时间戳的顺序,另一个基于创建日期的顺序:

select yt.*,
  row_number() over (partition by dept_id, dept_sub_id
    order by to_date(substr(file_name, -14), 'YYYYMMDDHH24MISS')) as rn_file_name,
  row_number() over (partition by dept_id, dept_sub_id
    order by create_date) as rn_create_date
from your_table yt;

FILE_NAME           S    DEPT_ID DEPT_SUB_ID CREATE_DATE                   RN_FILE_NAME RN_CREATE_DATE
------------------- - ---------- ----------- ----------------------------- ------------ --------------
TEST_20180806221733 C          1          10 2018-08-07 03:35:27.809494000            1              2
TEST_20180806221940 C          1          10 2018-08-07 04:12:20.957400000            2              3
TEST_20180806222127 C          1          10 2018-08-07 01:04:47.821795000            3              1
TEST_20180805201530 C          1          20 2018-08-06 03:55:27.809494000            1              3
TEST_20180805201640 C          1          20 2018-08-06 00:42:20.957400000            2              1
TEST_20180805202020 C          1          20 2018-08-06 02:24:47.821795000            3              2
然后筛选以查看不匹配:

select file_name, status, dept_id, dept_sub_id, create_date
from (
  select yt.*,
    row_number() over (partition by dept_id, dept_sub_id
      order by to_date(substr(file_name, -14), 'YYYYMMDDHH24MISS')) as rn_file_name,
    row_number() over (partition by dept_id, dept_sub_id
      order by create_date) as rn_create_date
  from your_table yt
)
where rn_file_name > rn_create_date;

FILE_NAME           S    DEPT_ID DEPT_SUB_ID CREATE_DATE                  
------------------- - ---------- ----------- -----------------------------
TEST_20180806222127 C          1          10 2018-08-07 01:04:47.821795000
TEST_20180805201640 C          1          20 2018-08-06 00:42:20.957400000
TEST_20180805202020 C          1          20 2018-08-06 02:24:47.821795000

如果您不想同时看到所有ID或子ID,可以在内部或外部查询中为特定ID或子ID添加筛选器。

您可以为每行分配两个排名,一个基于嵌入文件名的时间戳的顺序,另一个基于创建日期的顺序:

select yt.*,
  row_number() over (partition by dept_id, dept_sub_id
    order by to_date(substr(file_name, -14), 'YYYYMMDDHH24MISS')) as rn_file_name,
  row_number() over (partition by dept_id, dept_sub_id
    order by create_date) as rn_create_date
from your_table yt;

FILE_NAME           S    DEPT_ID DEPT_SUB_ID CREATE_DATE                   RN_FILE_NAME RN_CREATE_DATE
------------------- - ---------- ----------- ----------------------------- ------------ --------------
TEST_20180806221733 C          1          10 2018-08-07 03:35:27.809494000            1              2
TEST_20180806221940 C          1          10 2018-08-07 04:12:20.957400000            2              3
TEST_20180806222127 C          1          10 2018-08-07 01:04:47.821795000            3              1
TEST_20180805201530 C          1          20 2018-08-06 03:55:27.809494000            1              3
TEST_20180805201640 C          1          20 2018-08-06 00:42:20.957400000            2              1
TEST_20180805202020 C          1          20 2018-08-06 02:24:47.821795000            3              2
然后筛选以查看不匹配:

select file_name, status, dept_id, dept_sub_id, create_date
from (
  select yt.*,
    row_number() over (partition by dept_id, dept_sub_id
      order by to_date(substr(file_name, -14), 'YYYYMMDDHH24MISS')) as rn_file_name,
    row_number() over (partition by dept_id, dept_sub_id
      order by create_date) as rn_create_date
  from your_table yt
)
where rn_file_name > rn_create_date;

FILE_NAME           S    DEPT_ID DEPT_SUB_ID CREATE_DATE                  
------------------- - ---------- ----------- -----------------------------
TEST_20180806222127 C          1          10 2018-08-07 01:04:47.821795000
TEST_20180805201640 C          1          20 2018-08-06 00:42:20.957400000
TEST_20180805202020 C          1          20 2018-08-06 02:24:47.821795000

如果您不想一次看到所有ID或子ID,可以在内部或外部查询中为特定ID或子ID添加筛选器。

您在抽签中击败了我:)最终必须发生*8-)您在抽签中击败了我:)最终必须发生*8-)