从 SQL 窗口函数中排除分区?
Posted
技术标签:
【中文标题】从 SQL 窗口函数中排除分区?【英文标题】:Exclude a partition from a SQL window function? 【发布时间】: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
【参考方案1】:
您可以使用self join
和avg
窗口函数来做到这一点。
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 有点受限,只允许=
加入,所以我不能使用<>
部分。否则,这看起来是一个很好的答案,谢谢!
您可以将其用作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;
【讨论】:
以上是关于从 SQL 窗口函数中排除分区?的主要内容,如果未能解决你的问题,请参考以下文章