在日期时间戳中分隔日期和时间

时间:2017-09-14 10:16:45

标签: database kdb

我有一张这样的表:

enter image description here

我需要找到每隔一秒或每分钟间隔的总金额。我尝试使用xbar,但我似乎无法将日期和时间与数据分开。

此外,我想问一下如何在规定的时间间隔内添加用于汇总帐户的命令?

2 个答案:

答案 0 :(得分:1)

你是对的; xbar可用于此分组。然后,sum函数可用于聚合创建的每个组:

select sum Amount by 1 xbar Time.minute from t

或按时间列分组(时间戳基于整数)。

select sum Amount by Time from t

请参阅以下详细信息:

如果您的表格如下:

q})t: ([] Amount:`int$(); Time:`timestamp$() );
q)show meta t
c     | t f a
------| -----
Amount| i
Time  | p

使用以下数据:

q)`t insert (10?100;asc .z.p+10?00:10)
q)show t
Amount Time
------------------------------------
58     2017.09.14D10:44:48.992850000
68     2017.09.14D10:44:48.992850000
45     2017.09.14D10:47:48.992850000
2      2017.09.14D10:48:48.992850000
...

然后您可以使用xbar按每分钟间隔对表进行分组:

q)select sum Amount by 1 xbar Time.minute from t
minute| Amount
------| ------
10:44 | 126
10:47 | 45
10:48 | 41
10:49 | 113
...

或按5分钟间隔分组:

q)select sum Amount by 5 xbar Time.minute from t
minute| Amount
------| ------
10:40 | 126
10:45 | 199
10:50 | 210

或按5秒间隔分组:

q)select sum Amount by 5 xbar Time.second from t
second  | Amount
--------| ------
10:44:45| 126
10:47:45| 45
10:48:45| 41
10:49:45| 113
...

Amount列中的值将为每个组求和。

作为旁注,您还可以按时间列中的不同值进行分组:

q)select sum Amount by Time from t
Time                         | Amount
-----------------------------| ------
2017.09.14D10:44:48.992850000| 126
2017.09.14D10:47:48.992850000| 45
2017.09.14D10:48:48.992850000| 41
2017.09.14D10:49:48.992850000| 113
2017.09.14D10:51:48.992850000| 122
2017.09.14D10:52:48.992850000| 88

感谢。

答案 1 :(得分:0)

使用xbartime(或timestamp)数据类型时有一些问题。

1)每小时存储一次数据;您需要将时间转换为小时hh,因为time.hour在KDB中不可用。

q)select sum a by 1 xbar `hh$time from t

2)以毫/微精度进行存储,您需要在参数中使用绝对数。

q)select sum a by 1000000  xbar time from t