同一结果集的sql迭代

时间:2016-11-30 09:47:48

标签: sql oracle postgresql business-intelligence

为什么SQL不提供多次迭代查询结果的函数。我们可能有窗口功能。但它们是开箱即用的解决方案。我需要通用迭代函数。

让我详细解释一下,

假设示例查询和结果如下

select product p ,sum(sales) S 
from Data group by product

返回:

 Product,sum(sales)
 coffee,10
 EnergyDrink,30
 Tea,20

假设我需要获得每种产品的其他产品总销售额的总和。例如,在咖啡销售方面,我需要在其他专栏中单独总结茶和能量饮料销售

product         | sum sales | other sales
coffee          |     10    |  50   <30 +20>
EnergyDrink     |  30       |  30    <10 (coffee)+20(tea)>
Tea             |  20       |  40   <10+30>

要在mysql中实现这一点,

我需要的查询是,

 select T1.p,T1.S,sum(T2.S) from
 (select product p ,sum(sales) S from Data group by product) T1
 JOIN
    (select product p ,sum(sales) S from Data group by product) T2
    on T1.p!=T2.p and T1.S != T2.S group by 1,2

解释查询如下,

Explain as screenshot

在mysql中执行会创建3个派生的临时表,

但是在编程方面我需要迭代

的结果

从数据分组中选择产品p,总和(销售额)S

再次在内循环中。说3 * 3迭代。代码方式如下

for(int i=0;i<3;i++)
{
    int otherSales = 0;
    for(int j=0;j<3;j++)
    {
      if(data[j].product != data[i].product) // if product is not same
      {
         otherSales += data[j].sales; // add that sales to other sales
      }
    }
}


我建议在SQL中进行迭代行为,


假设SQL支持迭代函数,它允许再次迭代结果集。和特殊功能OUTER,可以访问外部循环访问('第i个循环中'产品的循环值')。如果我们有,我们可以使用下面的SQL,

select product p ,sum(sales) S ,
sum(iterate(if(outer(p)!=p,S,NULL)))
from Data group by product

这里迭代函数再次迭代结果集, outer(p)允许在outerscope中访问产品p

MS Power Pivot的DAX提供了这样一个功能EARLIER

如果我们在SQL中有类似的功能,它将有助于BI功能。

SQL有LEAD,LAG,RANK等。但它们是开箱即用的SQL窗口函数,它支持一级迭代。我的建议是用于通用迭代函数,它可以用于许多目的。

我的问题是我们是否需要 ITERATION 功能?或者数据库将使用智能处理这种复杂的嵌套(第一个涉及2级联接的示例sql)。如何在Postgres,oracle等中执行此类查询的当前场景?它不会创建与派生表相同的结果集的多个副本吗?

0 个答案:

没有答案