你好,有这样的表
import fabric.main
if __name__ == '__main__':
fabric.main.main()
我必须找到五个相应的失败状态,从最新日期开始向后。我会很乐意为我的案子提供一些帮助。
答案 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