计算超过和低于阈值的项目数

Posted

技术标签:

【中文标题】计算超过和低于阈值的项目数【英文标题】:Calculate number of item over and under threshold 【发布时间】:2015-08-11 02:50:17 【问题描述】:

我试图找出一个类别中总销售额的 80%(阈值)以上的“最快”商品数量,以及一个类别中总销售额的 80%(阈值)以下的商品数量。

以下是原始数据集。

Category    Items   Sales
0001        1000    400
0001        1001    100
0001        1002    13
0001        1003    300
0001        1004    10
0001        1005    11
0001        1006    12
0001        1007    200
0001        1008    14
0001        1009    15

占总销售额 (860) 的 80%(阈值)以上。

Category     Number of item *above threshold
0001         3

对于类别 0001,达到 80% 阈值的“最快”项目数是 3,即 1000、1003、1007,总共 900 (400 + 300 + 200)。

低于总销售额 (860) 的 80%(阈值)。

Category     Number of item *below threshold
0001         7

对于类别 0001,低于 80 % 阈值的项目数为 7,即 1001、1002、1004、1005、1006、1008、1009。

我不确定这是否可以通过基于集合的解决方案来实现,这些看起来需要迭代才能找到最快超过和低于 80% 销售阈值的商品数量。

我可以找出类别的总销售额,因此占总销售额的 80%,但我很难找出一个类别中超过 80%(阈值)的“最快”商品数量。有人知道怎么做吗?

如果您需要更多详细信息,请告诉我。

问候, 迈克

【问题讨论】:

你应该选择一个数据库。 mysql 的解决方案与另一个 db 的解决方案不同。 【参考方案1】:

应该适用于几乎所有 DMBS 的解决方案(在 MySQL 和 Oracle 上测试,也适用于 PostgreSQL、SQL Server 和 SQLite,但您必须注意不要在那里使用整数除法 [可以将累积销售额乘以 1.0让它真正在所有这些上运行]):

SELECT
   O.Category,
   SUM(CASE WHEN O.CumulativeSales / O.TotalSales < 1 - Thresh THEN 0 ELSE 1 END) Above,
   SUM(CASE WHEN O.CumulativeSales / O.TotalSales < 1 - Thresh THEN 1 ELSE 0 END) Under
FROM
   (SELECT
      T.Category,
      (SELECT
         SUM(Sales)
      FROM
         ...
      WHERE
         Sales <= T.Sales AND Category = T.Category
      ) AS CumulativeSales,
      (SELECT
         SUM(Sales)
      FROM
         ...
      WHERE
         Category = T.Category
      ) AS TotalSales
   FROM
      ... T
   ) O
GROUP BY
   O.Category
;

【讨论】:

【参考方案2】:

如果您使用的是 SQL Server 2012+:

SQL Fiddle

DECLARE @treshold NUMERIC(5, 2) = 0.80;

WITH Cte AS(
    SELECT *,
        ss = SUM(Sales) OVER(PARTITION BY Category ORDER BY Sales DESC)
    FROM tbl
)
SELECT
    c.Category,
    above = n,
    below = c.cnt - n
FROM(
    SELECT 
        Category, 
        cnt = COUNT(*),
        tresh = @treshold * SUM(Sales)
    FROM tbl GROUP BY Category
)c
OUTER APPLY(
    SELECT 
        n = COUNT(*)
    FROM Tbl
    WHERE Category = c.Category
    AND Sales >= (SELECT TOP 1 Sales FROM Cte WHERE ss >= c.tresh)
)a

结果

| Category | above | below |
|----------|-------|-------|
|     0001 |     3 |     7 |

【讨论】:

以上是关于计算超过和低于阈值的项目数的主要内容,如果未能解决你的问题,请参考以下文章

Sharepoint 2010列表视图阈值和项级别权限

为超过/低于阈值的值制作不同颜色的ggplot2热图

Python时间序列 - 计算低于/高于和指定最短持续时间阈值的周期

如果 JUnit 覆盖率低于某个阈值,如何使 Maven 构建失败

即使使用量低于阈值,Kubernetes 部署也不会缩减

如何为 iOS 项目设置最低代码覆盖率阈值?