Stored procedures 从现有表迭代以创建另一个表-Qlikview

Stored procedures 从现有表迭代以创建另一个表-Qlikview,stored-procedures,qlikview,qliksense,Stored Procedures,Qlikview,Qliksense,如果标题不够清晰,我深表歉意,但在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

如果标题不够清晰,我深表歉意,但在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;   

这应该可以工作,请参见代码中的注释:

T1://首先需要设置正确的时间戳和完成日期 加载*,时间戳+[持续时间]/24作为完成日期; 加载*,timestampleftdate,19,'DD-MM-YYYY hh:MM:ss'作为时间戳; 加载*内联[ 变量、状态、日期、持续时间小时数 A、 StatusA,10-09-2017 18:30:00.00,4 A、 状态B,10-09-2017 23:30:00.00,5 B、 StatusA,10-09-2017 10:00:00.00,8 B、 状态B,10-09-2017 21:45:00.00,9 ]; 左连接//在需要时添加拆分标志 加载不同的时间戳、FinishDate、FabsDataTeleftFinishDate、10 DateleftTimestamp、10>=1作为拆分标志 居民T1; T2://加载拆分标志的第一部分当前日期=1 加载变量、状态、, 时间戳, dayEndTimestamp作为FinishDate, roundDayEndTimestamp时间戳*24,0.1为[持续时间小时] 居民T1 其中SplitFlag=1; 连接//第二天加载第二部分,其中拆分标志=1 加载变量、状态、, daystartFinishDate作为时间戳, 完成日期, RoundFinishDateStartFinishDate*24,0.1为[持续时间小时] 居民T1 其中SplitFlag=1; 连接//添加数据拆分标志的其余部分=0 加载*驻留T1,其中SplitFlag=0;
升降台T1;查看间隔时间function@EldadT我还有一个问题与上述有关,请检查:好的。。请查看下面的我的答案。你检查了吗?@EldadT我为迟来的回复道歉,请检查我上面的脚本。嗨,我已经添加了上面的脚本。它似乎无法从T1中获取任何信息。它说T1在加载到qv时检查您的sql日期格式可能是一个数字-这是唯一可以使它不起作用的事情。也许您不需要这个行LOAD*,timestampleftdate,19,'DD-MM-YYYY hh:MM:ss'作为时间戳;或者你需要把leftDate,19改成别的。。。当我运行它时,它工作正常。数据库中的日期格式是2014-10-01 19:01:44.383。我想这只是时间戳。我看看是不是这样,你说得对。我删除了这个行Load*,timestampleftdate,19,'DD-MM-YYYY hh:MM:ss'作为时间戳;现在它正在获取行。谢谢你的帮助!这是另一个问题-请发布一个新问题