使用SQL获取总计的百分比的起点

问题描述 投票:0回答:1

我需要根据记录的“总计百分比”返回记录。因此,例如,我可能想知道“按客户划分的销售额的前10%”。

当前,我正在使用此:

SELECT * FROM (SELECT Dim1, SUM(SQ_Fact1) AS Fact1,
(SUM(SUM(SQ_Fact1)) OVER(ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER() AS PctOfTtl
FROM (SELECT Customer AS Dim1, SUM(Sales) AS SQ_Fact1
FROM SalesHistory GROUP BY Customer) AS sq
GROUP BY Dim1) AS mq
WHERE PctOfTtl<=0.10

这有点复杂,但这是构建查询的UI的一部分,因此它为所有查询创建了一个子查询和“ main”外部查询(出于与此无关的原因),然后必须使用另一个外部查询那些检查PctOfTtl。无论如何,要获取总计百分比(并对其进行降序排序,这样我就可以获得“最高”记录)的行是:

(SUM(SUM(SQ_Fact1)) OVER(ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER() AS PctOfTtl

然后在外部查询中,通过说“ WHERE PctOfTtl <= 0.10”来限制返回的总计百分比

问题是,PctOfTtl告诉我它们的总数百分比在哪里结束,而不是从哪里开始。

因此,可以说,最高客户占销售额的15%。它将的PctOfTtl为0.15。问题是,如果用户在销售额的前10%(<= 0.1)中要求客户,则它将不返回任何记录,因为最顶层的客户直到0.15才“结束”,因此他们的PctOfTtl不会是<= 0.1。我需要知道的是他们在总客户中所占的百分比(即最高的客户将从0开始,第二个客户从0.15开始,依此类推)。我真正要寻找的是所有“范围”的百分比落在用户指定百分比(即使超出范围)内的任何客户。

问题是,正如我所说的,这是针对查询构建的UI,因此,我无法完全重组查询来实现此目的。它必须在现有的“子查询/主查询”格式的范围内工作,使用“ OVER”子句可以做到这一点。我可以检查它们是否正在使用“ Top%”过滤器,如果是,则将其固定在PctOfTtl列上,并用一个限制PctOfTtl的外部查询包围查询。基本上,我希望找到一种使用OVER()的方法,该方法可以告诉我PctOfTtl减去“之前”的PctOfTtl。

sql tsql impala
1个回答
0
投票

尝试减去当前值:

SELECT *
FROM (SELECT Dim1, SUM(SQ_Fact1) AS Fact1,
             SUM(SQ_Fact1) / SUM(SUM(SQ_Fact1)) OVER () as PctOfTtl
             (SUM(SUM(SQ_Fact1)) OVER (ORDER BY SUM(SQ_Fact1) DESC))/SUM(SUM(SQ_Fact1)) OVER () AS Running_PctOfTtl
      FROM (SELECT Customer AS Dim1, SUM(Sales) SQ_Fact1
            FROM SalesHistory
            GROUP BY Customer
           ) sq
      GROUP BY Dim1
     ) mq
WHERE Running_PctOfTtl - PctOfTtl < 0.10;
© www.soinside.com 2019 - 2024. All rights reserved.