【问题标题】:Exclude a partition from a SQL window function?从 SQL 窗口函数中排除分区?
【发布时间】:2017-07-11 13:20:18
【问题描述】:

我的目标是计算不包括当前分区的平均值。在下表中,我想知道如何生成avg_prod_rev_oth_cust 列:其他客户的平均产品收入。这可以用窗口函数来完成吗?

cust  prod  rev  avg_prod_rev  avg_prod_rev_oth_cust
a       x    1           3.5         4.5
a       x    2           3.5         4.5
b       x    3           3.5         3.5
b       x    4           3.5         3.5
c       x    5           3.5         2.5
c       x    6           3.5         2.5
a       y    7           9.5        10.5
a       y    8           9.5        10.5
b       y    9           9.5         9.5
b       y   10           9.5         9.5
c       y   11           9.5         8.5
c       y   12           9.5         8.5

我正在使用 MariaDB 列存储。我相信 Columnstore 的窗口函数在语法上类似于 Amazon Redshift。

avg_prod_rev_oth_cust应计算为“该产品不包括该客户的收入之和/除以其他客户的销售额”。第一次出现: (3+4+5+6)/4 。

【问题讨论】:

  • avg_prod_rev_oth_cust应该如何计算?
  • 正如@vkp 提到的,请更详细地解释这个计算应该如何工作。另外,请以可用的形式提供 DDL 语句和示例数据,例如作为 SQL Fiddle(参见 sqlfiddle.com
  • 如果您知道您正在使用什么数据库,这也将有助于我们回答...
  • 一些问题回答了新版本的问题。要遵循的 DDL 语句。
  • 这是 SQL Fiddle,其中包括以下答案:sqlfiddle.com/#!17/4d4ed/7

标签: sql mariadb window-functions


【解决方案1】:

您可以使用self joinavg 窗口函数来做到这一点。

select distinct t1.*,avg(t2.rev) over(partition by t1.prod,t1.rev) as avg_prod_rev_oth_cust
from tbl t1
join tbl t2 on t1.prod=t2.prod 
where t1.cust<>t2.cust 

【讨论】:

  • 啊,我认为我使用 MDB 列存储这一事实并不重要,但显然它确实如此。 MCS 有点受限,只允许= 加入,所以我不能使用&lt;&gt; 部分。否则,这看起来是一个很好的答案,谢谢!
  • 您可以将其用作where 条件。
  • 在哪里使用!谢谢。
【解决方案2】:

没有窗口函数(所以,没有真正回答问题):

SELECT  cus,
        AVG(rev) AS AvgAll, 
        ( SELECT  AVG(rev) AS AvgOther
            FROM  ws_test
            WHERE  cus != t1.cus 
        ) AS AvgOther
    FROM  ws_test AS t1
    GROUP BY  cus;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2022-01-24
    • 2016-06-01
    • 2014-04-26
    • 2021-08-26
    相关资源
    最近更新 更多