如何在QlikView中将时间数据分组到存储桶中?

时间:2015-03-08 12:24:28

标签: qlikview

我在QlikView中有一个时间列表。例如:

1:45 am
2:34 am
3:55 am 
etc.

如何将其拆分为这样的组:

1 - 2 am
2 - 3 am
4 - 5 am
etc.

我使用了类函数,但出了点问题。它可以工作,但它不会创建时间桶,它会创建某种转换的十进制桶。

2 个答案:

答案 0 :(得分:2)

你有几个选项,到目前为止最简单的方法是创建一个重新格式化你的时间字段的新字段,例如我创建了TimeBucket,它将时间字段格式化为小时,并附加相同的时间,但上限增加了一个小时:

LOAD
    TimeField,
    Time(TimeField,'h tt') & ' - ' & Time(TimeField + maketime(1,0,0),'h tt') as TimeBucket;
LOAD 
    *
INLINE [
    TimeField
    1:45
    2:34
    3:55
    16:45
    17:56
];

然后产生以下结果:

Results of creating a custom field

但是,根据您的具体要求,此解决方案可能会因Time的性质而出现问题,因为这是dual函数。

另一种方法是使用intervalmatch,如下所示。要记住的一点是intervalmatch包括间隔中的终点。这意味着时间,我们必须做出结束"在下一个间隔开始之前的时间是一秒,否则如果源数据的时间位于间隔边界,我们将生成两个记录而不是一个。

TimeBuckets:
LOAD
    maketime(RecNo()-1,0,0) as Start,
    maketime(RecNo()-1,59,59) as End,
    trim(mid(time(maketime(RecNo()-1),'h tt'),1,2)) & ' - ' & trim(time(maketime(mod(RecNo(),24)),'h tt')) as Bucket
AUTOGENERATE(24);

SourceData:
LOAD
    *
INLINE [
    TimeField
    1:45
    2:34
    3:55
    16:45
    17:56
];

BucketedSourceData:
INTERVALMATCH (TimeField)
LOAD 
    Start,
    End
RESIDENT TimeBuckets;

LEFT JOIN (BucketedSourceData)
LOAD
    *
RESIDENT TimeBuckets;

DROP TABLES SourceData, TimeBuckets;

然后产生以下结果:

The results of using intervalmatch

有关intervalmatch的更多信息,请参阅QlikView安装帮助以及QlikView参考手册。

答案 1 :(得分:0)

在脚本中编写嵌套的if语句:

如果(时间> 1:45,'桶1',    如果(时间> 2:45,'桶2','其他'    ) )

不是最优雅的,但是如果你不能让1:45使用date()函数,你总是可以转换为军事时间,只需添加小时和分钟,然后从中制作桶。