Max a Sum of a partition by

Posted

技术标签:

【中文标题】Max a Sum of a partition by【英文标题】: 【发布时间】:2018-05-30 11:36:34 【问题描述】:

我有下表。

我想汇总小时数并按 id 分区,然后每个 custid 取 Max 小时数。以下是我到目前为止所拥有的。

表A

id    custid    projid   hours
 1      1010     Yellow    1
 1      1011     Yellow    2
 1      1012     Yellow    5
 1      1010     Yellow    5

SQL:

select SUM(HOURS)OVER (PARTITION BY ID ORDER BY cust) AS TOTAL_HRS
from tablea

预期输出:上述 SQL 未捕获 MAX hours

id    custid  projid  hours
 1      1010   Yellow  6

【问题讨论】:

您的问题缺少问题。 太快了!我不确定为什么它第一次没有显示,但问题已编辑。 另外,您为什么期望该单行中的数据?你向我们扔了一只兔子。 要对分析执行聚合,只需将分析包装在子查询/派生的 dable/cte 中,然后选择最大总和。您需要先计算分析结果,然后才能获得最大总和,因此有理由将其包装为派生表。 SQL 的操作顺序使您无法同时执行这两种操作;因此引入了派生表/cte。 【参考方案1】:

使用SUM 作为分析函数通常意味着您希望在保留所有原始记录的同时找到一个总和。但是您的预期输出似乎意味着聚合。所以,我建议使用GROUP BY,然后查询它以找到小时数最高的行。

WITH cte AS (
    SELECT id, custid, projid, SUM(hours) AS hours
    FROM yourTable
    GROUP BY id, custid, projid
)

SELECT *
FROM cte
ORDER BY hours DESC
WHERE rownum = 1

【讨论】:

【参考方案2】:

你还想要一个partition

select *, sum(hours) over (partition by id, custid, projid order by cust) AS TOTAL_HRS
from tablea t
order by sum(hours) over (partition by id, custid, projid order by cust) desc
fetch first 1 row only;

【讨论】:

【参考方案3】:

我想知道这是否能满足您的需求:

select cust, sum(hours) as total_hours
from tablea
order by sum(hours)
fetch first 1 row only;

尚不清楚为什么您需要该行中的其他值。如果这样做,您可以将它们聚合成一行。

【讨论】:

以上是关于Max a Sum of a partition by的主要内容,如果未能解决你的问题,请参考以下文章

Max Sum of Max-K-sub-sequence(单调队列)

Max Sum of Max-K-sub-sequence

HDU 3415 Max Sum of Max-K-sub-sequence

Number of dynamic partitions exceeded hive.exec.max.dynamic.partitions.pernode

UVA - 10891 —— Game of Sum

hdu3280Equal Sum Partitions (区间DP)