在查询中按计数除以计数,然后向上插入到新表

时间:2019-07-15 09:31:21

标签: kdb

给一个表,我希望得到公司在removedapproved的行之间的比率,并按一定范围(量)定界。

样品表

status   company amount
-----------------------
removed  a       100   
removed  b       200   
approved b       300   
removed  a       400   
approved b       500   
removed  b       600   
approved b       700   
removed  a       800
approved a       900   
removed  a       1000   

格式错误的查询:

update sample: count Status where (Status = `approved) % count Status where (Status = `removed) where (amount<= 500, amount > 0) by company from sample

update sample: count Status where (Status = `approved) % count Status where (Status = `removed) where (amount<= 1000, amount > 500) by company from sample

结果表

company  0-500  600-1000
-----------------------
  a       0       1/2
  b       2       1
  • A 有两个removed交易,范围​​为0-500,因此其比率为 0
  • B 有2个approved交易和1个removed交易,交易范围为0-500,因此其比率为 2
  • A 在600-1000范围内有一笔approved交易和两笔removed交易,因此其比率为 1/2 。< / li>
  • B 有一笔approved and one已取消的交易在600-1000范围内,因此其比率为 1

表格查询

sample:([]status:`removed`removed`approved`removed`approved`removed`approved`removed`approved`removed; company:`a`b`b`a`b`b`b`a`a`a; amount: 100 200 300 400 500 600 700 800 900 1000)

4 个答案:

答案 0 :(得分:4)

一种实现规范的潜在方法是形成两个选择查询并将它们横向连接。

q)a:select range1:(count status where status=`approved)%count status where status=`removed by company from sample where amount within (0;500)
q)b:select range2:(count status where status=`approved)%count status where status=`removed by company from sample where amount within (600;1000)
q)a ,' b
company| range1 range2
-------| -------------
a      | 0      0.5
b      | 2      1

此外,您可以重命名列,以便其名称与您在问题中所希望的一样

q)(`company,(`$"0-500"),(`$"600-1000")) xcol a,'b
company| 0-500 600-1000
-------| --------------
a      | 0     0.5
b      | 2     1

以下内容将为您提供所需的答案,但是它确实要求您查看0-600到600-1200的范围,因为xbar将把数量列拆分为600的倍数内的块以上是针对您要求的更具体的内容(例如0-500和600-1000)。

q)ratios:select (sum status=`approved)%sum status=`removed by company,600 xbar amount from sample
q)ratios
company amount| x
--------------| ---
a       0     | 0
a       600   | 0.5
b       0     | 2
b       600   | 1

然后可以旋转表格以提供所需的表格格式:

q)exec ((`$"0-600"),(`$"600-1200"))!x by company:company from ratios
company| 0-600 600-1200
-------| --------------
a      | 0     0.5
b      | 2     1

答案 1 :(得分:1)

这是一个两步过程:

第1步:按公司和金额范围计算比率。

q)t:([]status:`removed`removed`approved`removed`approved`removed`approved`removed`approved`removed;company:`a`b`b`a`b`b`b`a`a`a;amount:100 200 300 400 500 600 700 800 900 1000)

q) r:select   ratio:((%) . sum@'status=/:`approved`removed) by company, range:(`s#(0 600)!`0`600) amount from t

在这里,我首先使用排序的字典将金额分成多个存储桶。排序后的字典用作步进函数。

在那之后,它只是按公司和存储桶计算比率。

Output

company range| ratio
-------------| -----
a       0    | 0    
a       600  | 0.5  
b       0    | 2    
b       600  | 1  

它计算所需的结果。现在,我们必须将此输出转换为您想要的数据透视表。

步骤2:Pivot Table 此步骤会将最后的结果转换为所需的表输出。

q) P:asc exec distinct range from r
q) exec P#(range!ratio) by company:company from r
Output

company| 0 600
-------| -----
a      | 0 0.5
b      | 2 1 

您可以在步骤1中使用的已排序字典中更改所需的列名。

如果在任何时段范围内都没有removed条目,则定量为0w。如果要在这种情况下使用其他任何值,则可以在步骤1中进行处理。

答案 2 :(得分:1)

首先,我将获得该统计信息,然后可以进行列重命名,最后进行数据透视。对于使用xbar进行分类的人,但是在您的情况下,您需要binr来包含上限阈值。

thresholds: 500 1000
rename: 0 1!`$("0-500"; "500-1000")
temp: select r: (sum status = `approved ) % (sum status = `removed) by company, bucket: rename thresholds binr amount from sample
exec value[rename]#(bucket!r) by company:company from temp

要获取数据透视表,建议阅读以下内容: https://code.kx.com/v2/kb/pivoting-tables/

答案 3 :(得分:1)

我对此有所帮助,但这对我来说似乎很有意义。

首先,我创建了带有以下内容的随机样本表:

n:100;t:([]status:n?`a`r;company:n?`a`b`c`d;amount:100*n?10)
status company amount
---------------------
r      a       800
r      c       100
a      c       900
a      d       500
a      a       400
a      a       600
a      a       600
r      c       100
r      c       800
a      a       500
r      c       400
r      a       900
r      d       200
r      c       700
a      a       0
r      b       100
a      c       900
a      d       200
a      a       100
a      d       800

然后,我创建了一个具有不同大小范围的字典,其中值是下限:

g:`g1`g2`g3`g4!0 200 300 500

接下来,我在这里使用bin来获取每个存储桶范围内的比率:

q)select rat:sum[status=`a]%sum[status=`r] by company , amount:key[g] value[g] bin amount from t
company amount| rat
--------------| ---------
a       g1    | 1.666667
a       g2    | 0w
a       g3    | 0w
a       g4    | 0.6666667
b       g1    | 1
b       g2    | 1
b       g3    | 1.5
b       g4    | 1.333333
c       g1    | 0.3333333
c       g2    | 2
c       g3    | 0.3333333
c       g4    | 0.875
d       g1    | 0.6666667
d       g2    | 3
d       g3    | 3
d       g4    | 5

最后,我对整个事件进行了透视,以更好地可视化数据:

q){[x] exec  key[g]#amount!rat by company:company from x}  select rat:sum[status=`a]%sum[status=`r] by company , amount:key[g] value[g] bin amount from t
company| g1        g2 g3        g4
-------| --------------------------------
a      | 1.666667  0w 0w        0.6666667
b      | 1         1  1.5       1.333333
c      | 0.3333333 2  0.3333333 0.875
d      | 0.6666667 3  3         5