如何在pl / sql中找到五个相应的相等值

时间:2017-04-19 14:52:42

标签: sql plsql oracle11g

你好,有这样的表

import fabric.main

if __name__ == '__main__':
    fabric.main.main()

我必须找到五个相应的失败状态,从最新日期开始向后。我会很乐意为我的案子提供一些帮助。

1 个答案:

答案 0 :(得分:1)

据我了解,您的目标是找到最近五次运行都为Application状态的任何FAILED

PL/SQL不是实现这一目标所必需的;它可以通过正常SQL来实现 如果需要编译成过程,可以根据需要将SQL合并到过程块中。

下面是一个例子,但应该注意到有很多方法可以获得这种数据。

首先,创建表格:

CREATE TABLE APPLICATION_RUN (APPLICATION_NAME VARCHAR2(64), EVENT_DATE DATE, EVENT_STATUS VARCHAR2(64));

然后加载数据。

此示例中包含一些其他数据,因为您的帖子没有任何最近5次执行失败的示例。
此数据包括Application 3的5个最近失败,以及Application 1的5个旧失败。还有Application 4只有一次失败(还没有运行5次)。

INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('10-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('11-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('12-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('13-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('14-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('15-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('16-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('17-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('18-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('19-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('20-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('21-MAR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('22-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('23-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 1',TO_DATE('25-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('24-MAR-17','DD-MON-YY'),'SUCCEEDED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('20-APR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('21-APR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('22-APR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('23-APR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('24-APR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('25-APR-17','DD-MON-YY'),'FAILED');
INSERT INTO APPLICATION_RUN VALUES ('Application 4',TO_DATE('25-APR-17','DD-MON-YY'),'FAILED');

然后查询。
这个例子有三个步骤: 首先,将应用程序运行按其日期排序,最近一次 然后,扔出除最近的五个之外的所有东西,扔掉总共少于5次的东西 最后检查所有这五个是否FAILED。此示例查询使用命名的子因子查询进行布局,以突出显示这些目标。

WITH FIVE_MOST_RECENT_RUN AS (
   SELECT
     APPLICATION_NAME,
     EVENT_DATE,
     EVENT_STATUS
   FROM
     (SELECT
        APPLICATION_RUN.APPLICATION_NAME,
        APPLICATION_RUN.EVENT_DATE,
        APPLICATION_RUN.EVENT_STATUS,
        DENSE_RANK()
        OVER (
          PARTITION BY APPLICATION_RUN.APPLICATION_NAME
          ORDER BY EVENT_DATE DESC ) AS EVENT_RANK
      FROM APPLICATION_RUN) RANKED_APPLICATION_RUN
   WHERE RANKED_APPLICATION_RUN.EVENT_RANK < 6),
    RUN_STATUS_VARIATION AS (
     SELECT
       FIVE_MOST_RECENT_RUN.APPLICATION_NAME,
       COUNT(DISTINCT FIVE_MOST_RECENT_RUN.EVENT_STATUS) AS STATUS_VARIATIONS,
       MAX(FIVE_MOST_RECENT_RUN.EVENT_STATUS)
       KEEP
       (DENSE_RANK FIRST
         ORDER BY FIVE_MOST_RECENT_RUN.EVENT_DATE DESC)  AS MOST_RECENT_STATUS
     FROM FIVE_MOST_RECENT_RUN
     GROUP BY FIVE_MOST_RECENT_RUN.APPLICATION_NAME
  HAVING COUNT(*) > 4)
SELECT RUN_STATUS_VARIATION.APPLICATION_NAME
FROM RUN_STATUS_VARIATION
WHERE RUN_STATUS_VARIATION.STATUS_VARIATIONS = 1
      AND RUN_STATUS_VARIATION.MOST_RECENT_STATUS = 'FAILED';

然后测试一下:

APPLICATION_NAME  
Application 3     

如果您为SUCCEEDED添加了比其他Application 3更新的新Application 3次运行,则查询将不再返回INSERT INTO APPLICATION_RUN VALUES ('Application 3',TO_DATE('26-APR-17','DD-MON-YY'),'SUCCEEDED');

no rows selected

然后又跑了:

groupby