2017-12-21 11 views
0

아래의 쿼리를 사용하여 Input_MBOutput_MB을 현재 타임 스탬프로 사용합니다. 그러나 이전 1 시간 데이터와 비교하여 입력 및 출력 값이 같은 행에 어떻게 있는지 비교해야합니다. 그것을 기반으로 증가/감소 추세를 넣어야합니다.두 개의 보고서를 비교할 SQL 쿼리 타임 스탬프 및 쇼 증가/감소 추세

쿼리 내가 9:30을 얻기 위해 사용 10:30 리포트 :

SELECT 
    A.last_updated, 
    B.SERVER AS Server, 
    D.STREAM_NAME AS Stream, 
    A.INPUT AS Input, 
    A.OUTPUT AS Output 
FROM table1 A, 
    table2 B, 
    table3 C, 
    table4 D 
WHERE A.ALARM_BACKLOG = '1' 
AND C.MONIT_STATUS = 'ACTIVE' 
AND A.NODE_MAN_ID = B.NODE_MAN_ID 
AND A.NODE_ID = C.NODE_ID 
AND B.STR_ID = D.STR_ID 
AND B.NODE_MAN_ID = C.NODE_MAN_ID 
ORDER BY NM.HOST_SERVER_NAME, S.STREAM_NAME DESC 

한다고 가정 오전 9:30 리포트 :로

Last_updated Server stream input output 
9:30 AM A 1 80 0 
9:30 AM EFH 7 8 20 
9:30 AM D 5 60 0 
9:30 AM E 8 25 100 

오전 10:30 보고서를 가정 :

Last_updated Server stream input output 
10:30 AM A 1 40 0 
10:30 AM C 7 0 8 
10:30 AM D 5 72 0 
10:30 AM B 3 0 0 
10:30 AM E 8 25 115 

그러나 10시 30 분 보고서는 아래와 같아야합니다.

Last_updated Server stream input "Input 
Trend" output "Output 
Trend" 
10:30 AM A 1 40 50%-Down 0 No change 
10:30 AM C 7 0 New 8 New 
10:30 AM D 5 72 20%- Up 0 New 
10:30 AM B 3 0 New 0 New 
10:30 AM E 8 25 No change 15%-Up New 

답변

1

어쩌면이 시도

Select A.last_updated, A.SERVER, B.Stream,A.INPUT, 
Case 
    When B.INPUT is Null Then 'New' 
    When A.INPUT=B.INPUT Then 'No change' 
    When A.INPUT<B.INPUT Then Cast((B.INPUT-A.INPUT)/B.INPUT*100 as Varchar(10))+'%-Down' 
    When A.INPUT>B.INPUT Then Cast((A.INPUT-B.INPUT)/B.INPUT*100 as Varchar(10))+'%-Up' 
End INPUT_TREND, 
A.OUTPUT, 
Case 
    When B.OUTPUT is Null Then 'New' 
    When A.OUTPUT=B.OUTPUT Then 'No change' 
    When A.OUTPUT<B.OUTPUT Then Cast((B.OUTPUT-A.OUTPUT)/B.OUTPUT*100 as Varchar(10))+'%-Down' 
    When A.OUTPUT>B.OUTPUT Then Cast((A.OUTPUT-B.OUTPUT)/B.OUTPUT*100 as Varchar(10))+'%-Up' 
End INPUT_TREND 

From 
(
Select A.last_updated, B.SERVER, D.STREAM_NAME as Stream, A.INPUT, A.OUTPUT ,RANK() OVER (ORDER BY A.last_updated Desc) Row_id 
From table1 A 
Join table2 B on A.NODE_MAN_ID = B.NODE_MAN_ID 
Join table3 C on A.NODE_ID = C.NODE_ID and B.NODE_MAN_ID= C.NODE_MAN_ID 
Join table4 D on B.STR_ID = D.STR_ID 
Where A.ALARM_BACKLOG = '1' and C.MONIT_STATUS = 'ACTIVE') A 
Left join 
(
Select A.last_updated, B.SERVER, D.STREAM_NAME as Stream, A.INPUT, A.OUTPUT,RANK() OVER (ORDER BY A.last_updated Desc) Row_id 
From table1 A 
Join table2 B on A.NODE_MAN_ID = B.NODE_MAN_ID 
Join table3 C on A.NODE_ID = C.NODE_ID and B.NODE_MAN_ID= C.NODE_MAN_ID 
Join table4 D on B.STR_ID = D.STR_ID 
Where A.ALARM_BACKLOG = '1' and C.MONIT_STATUS = 'ACTIVE') B on B.Row_id=A.Row_id+1 and A.SERVER=B.SERVER and A.Stream=B.Stream 
Where A.last_updated='10:30 AM' 
+0

덕분에 많이 (내가 테스트없이 썼다). INPUT은 table1 인 하나의 테이블에만 있습니다. 당신이 추가 한 특별한 이유 ..A.INPUT = B.INPUT – user2642751

+0

A와 B는 서브 케릭터들에 대한 별칭 들임 – DamianR

+0

ORA-00904 : "A". "ROW_ID": 유효하지 않은 식별자 00904. 00000 - "% s : 유효하지 않은 식별자" * 원인 : * 동작 : 행의 오류 : 오류 : 33 열 : 84 – user2642751