2017-09-24 10 views
1

제목이 분명하지 않지만 Qlikview에서 할 수 있다면 사과드립니다.다른 테이블을 만들기 위해 기존 테이블에서 반복 - Qlikview

데이터베이스에서로드 된 원본 테이블입니다.

Variable Status Date     Duration (Hours) 
A   StatusA 9/10/2017 18:30:00.00 4 
A   StatusB 9/10/2017 23:30:00.00 5 
B   StatusA 9/10/2017 10:00:00.00 8 
B   StatusB 9/10/2017 21:45:00.00 9 

어떻게 처리할까요?

Variable Status Date     Duration (Hours) FinishDate 
A   StatusA 9/10/2017 18:30:00.00 4     9/10/2017 22:30:00.00 
A   StatusB 9/10/2017 23:30:00.00 0.5     9/10/2017 23:59:59.59 
A   StatusB 9/11/2017 0:00:00.00 4.5     9/11/2017 3:30:00.00 
B   StatusA 9/10/2017 10:00:00.00 8     9/10/2017 18:00:00.00 
B   StatusB 9/10/2017 21:45:00.00 2.25    9/10/2017 23:59:59.59 
B   StatusB 9/11/2017 0:00:00.00 6.75    9/11/2017 6:15:00.00 

나는이 주민 표하지만 어떻게 변수의 실행 시간이 하루에 다음 다음날로 기간을 구분하는 다른 행을 생성 초과 여부를 확인하는 방법을 통해 가능하다 알고있다. 지난 주 (또는 토요일)에 변수을 초과하면 데이터가 정확하지 않으므로 일주일 단위로 필터가 있기 때문에 이런 경우입니다.

결과 데이터는 개 변수에 따라 총 기간이 필요하며 주별로 필터링됩니다.

스크립트 :

T1: 
LOAD *, timestamp(Timestamp+[Duration Hours]/24) as FinishDate; 
LOAD *, timestamp(Timestamp#(left(Date,19),'DD-MM-YYYY hh:mm:ss')) as Timestamp; 
LOAD 
    [EquipmentID] AS [Equipment ID], 
    [TransactionDate] AS [Date], 
    [LotID] AS [Lot ID], 
    [Status] AS [Status], 
    [DurationHours] AS [Duration Hours]; 
SQL 
    SELECT * 
    FROM [SQL_SourceDB].[dbo].[SourceTable] 
    WHERE [TransactionDate] >= '2016-01-01 00:00:00.000' AND [TransactionDate] <= '2016-01-31 00:00:00.000'; 

Left Join // add a split-flag where needed 
LOAD Distinct Timestamp,FinishDate,fabs(Date(left(FinishDate,10))-Date(left(Timestamp,10)) >=1) as SplitFlag 
Resident T1; 

T2: // load first part (current day) of split-flag=1 
LOAD 
    [Equipment ID], 
    [Timestamp] AS [Date], 
    [Lot ID], 
    [Status], 
    round((DayEnd(Timestamp)-Timestamp)*24,0.1) AS [Duration Hours] 
Resident T1 
Where SplitFlag=1; 
Concatenate // load second part (next day) where split-flag=1 
LOAD 
    [Equipment ID], 
    daystart(FinishDate) AS [Date], 
    [Lot ID], 
    [Status], 
    round((FinishDate-daystart(FinishDate))*24,0.1) AS [Duration Hours] 
Resident T1 
Where SplitFlag=1; 
Concatenate // add the rest of the data (split-flag=0) 
LOAD * Resident T1 Where SplitFlag=0; 

DROP Table T1; 
+0

체크 아웃 내가 관련된 다른 질문이 @EldadT "간격"기능 – EldadT

+0

를 친절하게 확인하십시오 : https://stackoverflow.com/questions/46400966/add-and-deduct-on-datetime-qlikview –

+0

확인 .. 확인 아래 내 대답을 – EldadT

답변

2

이 작동 (코드에 주석 참조)해야합니다

T1: // first need to set a proper timestamp and FinishDate 
 
Load *, timestamp(Timestamp+[Duration (Hours)]/24) as FinishDate; 
 
Load *, timestamp(Timestamp#(left(Date,19),'DD-MM-YYYY hh:mm:ss')) as Timestamp; 
 
LOAD * INLINE [ 
 
    Variable, Status, Date, Duration (Hours) 
 
    A, StatusA, 10-09-2017 18:30:00.00, 4 
 
    A, StatusB, 10-09-2017 23:30:00.00, 5 
 
    B, StatusA, 10-09-2017 10:00:00.00, 8 
 
    B, StatusB, 10-09-2017 21:45:00.00, 9 
 
]; 
 

 
left join // add a split-flag where needed 
 
Load Distinct Timestamp,FinishDate,fabs(Date(left(FinishDate,10))-Date(left(Timestamp,10)) >=1) as SplitFlag 
 
Resident T1; 
 

 
T2: // load first part (current day) of split-flag=1 
 
Load Variable,Status, 
 
\t Timestamp, 
 
\t dayEnd(Timestamp) as FinishDate, 
 
\t round((DayEnd(Timestamp)-Timestamp)*24,0.1) as [Duration (Hours)] 
 
Resident T1 
 
where SplitFlag=1; 
 
Concatenate // load second part (next day) where split-flag=1 
 
Load Variable,Status, 
 
\t daystart(FinishDate) as Timestamp, 
 
\t FinishDate, 
 
\t round((FinishDate-daystart(FinishDate))*24,0.1) as [Duration (Hours)] 
 
Resident T1 
 
where SplitFlag=1; 
 
Concatenate // add the rest of the data (split-flag=0) 
 
Load * Resident T1 Where SplitFlag=0; 
 

 
drop table T1; \t

+0

안녕하세요, 위의 스크립트를 추가했습니다. 그것은 T1에서 아무것도 가져 오지 않는 것 같습니다. 그것은 말합니다'T1 << [SourceTable] 468,590 회선 T1 468,590 회선이 반입 됨 T2 << T1 회선이 반입 됨 T2 << T1 회선이 페치 됨 T2 << T1 회선이 페치 됨 >> –

+0

로드 될 때 sql 날짜 형식을 확인하십시오 qv (아마도 숫자) - 이것이 작동하지 않게하는 유일한 방법입니다. timestamp로 "LOAD *, timestamp (타임 스탬프 # (왼쪽 (날짜, 19), 'DD-MM-YYYY hh : mm : ss')) 또는 어쩌면 당신은 뭔가 다른 왼쪽 (날짜, 19)을 변경해야합니다 ... 내가 그것을 실행할 때 그것은 작동합니다 OK – EldadT

+0

데이터베이스에서 날짜의 형식은'2014-10-01 19 : 01 : 44.383'입니다. 시간 스탬프 일 뿐이라고 생각합니다. 이것이 사실인지 나는 알 것이다. –