【问题标题】:Merge selected group keys in KDB (Q) group by query通过查询合并 KDB (Q) 组中选定的组键
【发布时间】:2020-05-07 10:15:38
【问题描述】:

我有一个查询,该查询本质上是按 KDB 中的组键计数的,我想将其中的一些组视为一个组,以便进行此查询。对我正在尝试做的事情的简化描述是在一个月内按客户计算订单,其中我在数据库中有几个客户实际上是另一个客户的子公司,我想合并子公司的计数与他们的上级组织。实际情况比这要复杂得多,并且没有涉及不必要的细节,足以说明我不能只按客户分组并在执行查询后操纵结果以合并计数 - 我需要我的“by”子句查询直接进行合并。

在 SQL 中,我会这样做:

select customer_id, count(*) as order_count
from orders
order by select case when customer_id = 1 then 2 when customer_id = 3 then 4 else customer_id end

在上面的例子中,客户 1 是客户 2 的子公司,客户 3 是客户 4 的子公司,其他所有客户都被正常对待

假设 Q 中的等效代码(没有对组键的操作)是:

select order_count:count i by customer_id from orders

如何放入等效的select case 语句来操作组密钥?我试过这个,但得到一个rank 错误:

select order_count:count i by $[customer_id=1;2;customer_id=3;4;customer_id] from orders

我的 Q 很糟糕,所以我可能犯了一个非常简单的错误。非常感谢任何建议。

【问题讨论】:

    标签: kdb


    【解决方案1】:

    一种方法可能是拥有一个子公司字典并在您的 by 子句中使用查找/重新映射:

    q)dict:1 3!2 4
    q)show t:([] order:1+til 10;customer:1+10?6)
    order customer
    --------------
    1     1
    2     1
    3     6
    4     2
    5     3
    6     4
    7     5
    8     5
    9     3
    10    5
    
    q)select order_count:count i by customer^dict[customer] from t
    customer| order_count
    --------| -----------
    2       | 3
    4       | 3
    5       | 3
    6       | 1
    

    你会丢失一些关于谁实际拥有订单的信息,你只会在父级知道

    【讨论】:

    • 如果可行,它比我想到的内联子句要优雅得多:) 非常感谢 - 现在让我尝试将它应用到我的真实场景中,看看它是否成立,但看起来对我来说完全合乎逻辑
    • 是的,这正是我想要的,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2020-01-09
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多