【问题标题】:Cannot mix aggregate and non-aggregate values不能混合聚合值和非聚合值
【发布时间】:2021-11-07 02:33:08
【问题描述】:

我有一个表 (table1),其中包含 3 个类别/子类别列、callID、客户端 ID 和持续时间。客户端 ID 可以重复(它们具有属于不同子类别的不同 callID)。

我有另一个表 (table2),其中包含唯一的客户 ID 和 $amount。

我希望使用 with 语句,其中的表显示唯一 ID 和 sum(duration) 作为 Totalduration(来自表 1)。 然后选择 cat1, cat2, cat3, clientID, sum(duration), $amount*Totalduration/duration 两个表的内连接,按 1,2,3,4 分组

基本上,这将根据持续时间按比例计算 $amount。但是这当然行不通,不能混合聚合和非聚合:(

请提供有关如何执行此操作的任何提示/想法?

谢谢

编辑:

表 1:

Cat 1   Cat 2   Cat 3  CallID   Client ID  Duration
A       A       A      1        1          50
A       A       C      2        1          30
A       A       A      3        2          52
A       A       C      4        3          20
A       B       C      5        3          40
C       C       C      6        3          15
A       C       C      7        4          18
C       C       C      8        5          65
C       B       B      9        6          51

表 2:

Client ID    Cost
1            150
2            190
3            130
4            120
5            140
6            190

我正在尝试为 3 只猫的每个独特组合获取此 Result_table:

Cat 1   Cat 2   Cat 3  Total Duration  Blended Cost
A       A       A      ...             ...
A       A       C      ...             ...
A       B       C      ...             ...
C       C       C      ...             ...
A       C       C      ...             ...
C       C       C      ...             ...
C       B       B      ...             ...

按唯一客户 ID 的持续时间按比例混合成本。例如,客户端 1 在 A/A/A 中的持续时间为 50 分钟,在 A/A/C 中为 30 分钟,成本为 150,在 Result_table 中,我们将为行 A/A/A 添加 50 分钟的总持续时间和 150* 30/(30+50) 混合成本。然后用同样的逻辑不断总结以下客户。

【问题讨论】:

  • 请提供示例数据和所需结果,最好在问题的文本表中提供。
  • @GordonLinoff 谢谢,我已经编辑了我的问题
  • 您的问题没有显示预期的结果,实际预期的计算结果基于测试数据。注意,结果中有两次 C、C、C,但你说:I'm trying to get this Result_table for each unique combination of the 3 Cats

标签: sql vertica


【解决方案1】:

认为我明白。您试图将客户的成本分摊到各个类别中,然后按类别进行汇总。窗口函数!

select cat1, cat2, cat3, sum(duration),
       sum(cost * duration * 1.0 / client_duration) as blended_cost
from (select t1.*, t2.cost,
             sum(t1.duration) over (partition by t1.clientid) as client_duration
      from table1 t1 join
           table2 t2
           on t1.clientid = t2.clientid
     ) t1
group by cat1, cat2, cat3;

【讨论】:

  • 谢谢戈登!你是对的,这就是我一直在寻找的,如果原始信息不清楚,我很抱歉我可能太累了,应该等到今天早上再发帖。我可能应该找到另一个培训,我完成了我公司的 2 小时 sql 教程,但从未听说过窗口函数......我感觉他们遗漏了一些其他基本工具,比如这些!
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 2014-12-25
  • 1970-01-01
相关资源
最近更新 更多