阵列列中的Presto SQL计数出现次数并添加缺少的时间戳记

时间:2018-10-09 17:43:48

标签: sql presto

我的Presto SQL语句将具有日期时间的多个行聚合到具有这些日期时间的数组的单行中(所有其他属性在这些行中相同)。所以我最终得到这样的结果(有任意数量的列,这被简化了):

id | timestamps
1    [ 2018-10-01 00:00:00.000, 2018-10-01 00:00:00.000, 2018-10-01 01:00:00.000, 2018-10-01 01:00:00.000, 2018-10-01 01:00:00.000]
2    [ 2018-10-01 00:00:00.000, 2018-10-01 01:00:00.000, 2018-10-01 01:00:00.000]

我实际上要执行三个步骤,我想计算每行每个日期的出现次数,所以可能是这样的:

id | timestamps
1    [ { 2018-10-01 00:00:00.000 : 2}, { 2018-10-01 01:00:00.000 : 3}]
2    [ { 2018-10-01 00:00:00.000 : 1}, { 2018-10-01 01:00:00.000 : 2}] 

然后,给定起点和终点,例如2018-10-01 00:00:00.00到2018-10-01 02:00:00.00,使用0计数填写所有缺少的时间戳记

id | timestamps
1    [ { 2018-10-01 00:00:00.000 : 2}, { 2018-10-01 01:00:00.000 : 3}, { 2018-10-01 02:00:00.000 : 0}]
2    [ { 2018-10-01 00:00:00.000 : 1}, { 2018-10-01 01:00:00.000 : 2}, { 2018-10-01 02:00:00.000 : 0}] 

然后我想提供一个百分比,例如60%,并找出至少经常出现的最大计数并将其保存为该行的一列。因此,它看起来像:

id   | timestamps                                                                                      | col3
1    [ { 2018-10-01 00:00:00.00 : 2}, { 2018-10-01 01:00:00.000 : 3}, { 2018-10-01 02:00:00.000 : 0}]   2
2    [ { 2018-10-01 00:00:00.000: 1}, { 2018-10-01 01:00:00.000 : 2}, { 2018-10-01 02:00:00.000 : 0}]   1

对于第一行,3仅在33%的时间出现,而2在66%的时间出现(对于计数3,它包括计数2和计数1),因此给定阈值60%,我要捕获的数字是2。在第二行中,仅33%的时间发生2,而66%的时间发生1,因此要捕获的数字为1。如果提供了30%作为阈值对于第二行,则捕获2。

在SQL中这些步骤是否可行?如果是这样,执行这些步骤的功能/机制是什么?

0 个答案:

没有答案