首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >KDB/Q查询符合连续条件的行?

KDB/Q查询符合连续条件的行?
EN

Stack Overflow用户
提问于 2019-06-20 02:55:04
回答 2查看 1.3K关注 0票数 1

我在寻找交易(连续的?)在一组数据中,尽管在一天内取消了几次交易,但它们还是遵循了最终完成交易的趋势。

有效的批处理事务必须满足一组条件。

  1. 他们应该是同一家商店的。
  2. 他们最终应该完成,即X数量的取消,但1完成。
  3. 挂起的批处理事务(取消和完成)不应超过特定的时间范围,例如,1天。
  4. 这些交易应该有相同数量的现金标记,被认为是“相同的”交易。
  5. 事务应以天数为单位,即任何待处理的批不应视为第二天的连续性。
  6. 金额为10,1000,10000的取消交易应被忽略。

查询应保留符合上述条件的所有批。最后一个表应该有一个列batch,其中包含正在运行的批处理总数,以区分它们。

初始表:

代码语言:javascript
运行
复制
shop amount status    date    
------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101011
A    1000   Completed 20101011
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
C    333    Cancelled 20101012
C    333    Completed 20101012
C    333    Completed 20101012
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013
D    155    Completed 20101013

按天划分的

代码语言:javascript
运行
复制
shop amount status    date    
------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010
A    1234   Cancelled 20101010
------------------------------
A    1234   Completed 20101011
A    1000   Completed 20101011
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
------------------------------
C    333    Cancelled 20101012
C    333    Completed 20101012
C    333    Completed 20101012
------------------------------
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013
D    155    Completed 20101013

结式表:

代码语言:javascript
运行
复制
shop amount status    date     batch
-------------------------------------
A    1234   Cancelled 20101010   1
A    1234   Cancelled 20101010   1
A    1234   Completed 20101010   1
-------------------------------------
A    1234   Completed 20101011   2
A    1000   Completed 20101011   3
-------------------------------------
C    333    Cancelled 20101012   4
C    333    Completed 20101012   4
C    333    Completed 20101012   5
-------------------------------------
D    111    Cancelled 20101013   6
D    155    Cancelled 20101013   7
D    111    Completed 20101013   6
D    155    Completed 20101013   7

表查询:

代码语言:javascript
运行
复制
([] shop:`A`A`A`A`A`A`B`B`B`B`C`C`C`D`D`D`D; amount: 1234 1234 1234 1234 1234 1000 100 100 4321 4321 333 333 333 111 155 111 155; status:`Cancelled`Cancelled`Completed`Cancelled`Completed`Completed`Cancelled`Cancelled`Cancelled`Cancelled`Cancelled`Completed`Completed`Cancelled`Cancelled`Completed`Completed; date: `20101010`20101010`20101010`20101010`20101011`20101011`20101011`20101011`20101011`20101011`20101012`20101012`20101012`20101013`20101013`20101013`20101013)

Explanation:

  1. 在第一天,A进行4次事务处理。前三个被批次在一起,因为它们的数量相同,取消了->,取消了->完成了。最后一个事务被忽略,因为它是一天的结束。
  2. 在第二天,A进行相同数量的1234事务,但它不会将前一天的事务作为其批处理的一部分。一个完成1000的另一个事务。B进行四次交易,但没有跟踪,因为它们是(A)取消或( b) 10的权力。
  3. 在第三天,C进行了三个相同金额的事务。这被认为是两批,因为第一批取消和完成形成了最初的批处理,并且最终完成的事务本身是一个批处理。
  4. 在第四天,D进行四个事务并形成两个批。请注意,这里的事务并不是连续的,因为有两个不同数量的已取消的事务,但这两个事务都将在将来完成。

表按时间戳和日期排序,即23:59:59至00:00:00 :00。查询不需要是一行,也可以是多行查询,可以写入任何临时表/变量等。

此外,如果有一种方法可以获得每批每批取消的事务数,这将是有帮助的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-20 09:24:13

因此,首先计算已完成的批数。

代码语言:javascript
运行
复制
q)n:count select from tab where status=`Completed

然后使用下面的查询为每个已完成的行分配批号

代码语言:javascript
运行
复制
q)btab:update batch:1+til n from tab where status=`Completed
q)btab
shop amount status    date     batch
------------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010 1
A    1234   Cancelled 20101010
A    1234   Completed 20101011 2
A    1000   Completed 20101011 3
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
C    333    Cancelled 20101012
C    333    Completed 20101012 4
C    333    Completed 20101012 5
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013 6
D    155    Completed 20101013 7

然后倒转表,按日期、商店和数量填写空号,并倒转并移除任何10的幂(使用与terrylynch相同的逻辑)。

代码语言:javascript
运行
复制
q)ftab:reverse update fills batch by date,shop,amount from reverse btab where not (status=`Cancelled)&{x=`int$x}10 xlog amount
q)ftab
shop amount status    date     batch
------------------------------------
A    1234   Cancelled 20101010 1
A    1234   Cancelled 20101010 1
A    1234   Completed 20101010 1
A    1234   Cancelled 20101010
A    1234   Completed 20101011 2
A    1000   Completed 20101011 3
B    100    Cancelled 20101011
B    100    Cancelled 20101011
B    4321   Cancelled 20101011
B    4321   Cancelled 20101011
C    333    Cancelled 20101012 4
C    333    Completed 20101012 4
C    333    Completed 20101012 5
D    111    Cancelled 20101013 6
D    155    Cancelled 20101013 7
D    111    Completed 20101013 6
D    155    Completed 20101013 7

然后从表中选择并提取具有批号的数据。

代码语言:javascript
运行
复制
q)stab:select from ftab where batch<>0N
q)stab
shop amount status    date     batch
------------------------------------
A    1234   Cancelled 20101010 1
A    1234   Cancelled 20101010 1
A    1234   Completed 20101010 1
A    1234   Completed 20101011 2
A    1000   Completed 20101011 3
C    333    Cancelled 20101012 4
C    333    Completed 20101012 4
C    333    Completed 20101012 5
D    111    Cancelled 20101013 6
D    155    Cancelled 20101013 7
D    111    Completed 20101013 6
D    155    Completed 20101013 7
q)

最后,这里是一个查询,用于获取每批取消的数量。

代码语言:javascript
运行
复制
q)select numberOfCancellations:-1+count batch by batch from stab
batch| numberOfCancellations
-----| ---------------------
1    | 2
2    | 0
3    | 0
4    | 1
5    | 0
6    | 1
7    | 1
票数 10
EN

Stack Overflow用户

发布于 2019-06-20 09:05:05

这不是最后的查询,但至少是一个起点:

代码语言:javascript
运行
复制
q)select from tab where not (status=`Cancelled)&{x=`int$x}10 xlog amount, ({raze(reverse maxs reverse@)each`Completed=x[`status] group x`amount};([]amount;status)) fby ([]date;shop)
shop amount status    date    
------------------------------
A    1234   Cancelled 20101010
A    1234   Cancelled 20101010
A    1234   Completed 20101010
A    1234   Completed 20101011
A    1000   Completed 20101011
C    333    Cancelled 20101012
C    333    Completed 20101012
C    333    Completed 20101012
D    111    Cancelled 20101013
D    155    Cancelled 20101013
D    111    Completed 20101013
D    155    Completed 20101013

可以使用后续查询来完成批处理逻辑。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56678344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档