给一个表,我希望得到公司在removed
和approved
的行之间的比率,并按一定范围(量)定界。>
样品表
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
removed
交易,范围为0-500,因此其比率为 0 。approved
交易和1个removed
交易,交易范围为0-500,因此其比率为 2 。approved
交易和两笔removed
交易,因此其比率为 1/2 。< / li>
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)
答案 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