gpt4 book ai didi

sql - 在 SQL 中选择具有多个 GROUP 的表中 TOP 2 值的 SUM

转载 作者:行者123 更新时间:2023-12-02 11:21:03 24 4
gpt4 key购买 nike

我一直在 SQL Server 2000 中使用集合,并且我的临时表之一 (#Periods) 具有以下表结构:

    RestCTR     HoursCTR    Duration    Rest    ----------------------------------------    1           337         2           0    2           337         46          1    3           337         2           0    4           337         46          1    5           338         1           0    6           338         46          1    7           338         2           0    8           338         46          1    9           338         1           0    10          339         46          1    ...

What I'd like to do is to calculate the Sum of the 2 longest Rest periods for each HoursCTR, preferably using sets and temp tables (rather than cursors, or nested subqueries).

Here's the dream query that just won't work in SQL (no matter how many times I run it):

Select HoursCTR, SUM ( TOP 2 Duration ) as LongestBreaks
FROM #Periods
WHERE Rest = 1
Group By HoursCTR

HoursCTR 可以有任意数量的休息时间(包括没有休息时间)。

我目前的解决方案不是很优雅,基本上涉及以下步骤:

  1. 获取最长休息时间(按 HourCTR 分组)
  2. 选择第一个(最小)RestCTR 行,该行返回每个小时点击率的最大持续时间
  3. 重复第 1 步(不包括第 2 步中已收集的行)
  4. 重复步骤 2(再次排除步骤 2 中收集的行)
  5. 将 RestCTR 行(来自第 2 步和第 4 步)合并到单个表中
  6. 获取第 5 步中各行所指向的持续时间的总和(按 HoursCTR 分组)

如果有任何集合函数可以减少这个过程,我们将非常欢迎。

最佳答案

在 SQL Server 中执行此操作的最佳方法是使用 common table expression ,使用开窗函数 ROW_NUMBER() 对每组中的行进行编号:

WITH NumberedPeriods AS (
SELECT HoursCTR, Duration, ROW_NUMBER()
OVER (PARTITION BY HoursCTR ORDER BY Duration DESC) AS RN
FROM #Periods
WHERE Rest = 1
)
SELECT HoursCTR, SUM(Duration) AS LongestBreaks
FROM NumberedPeriods
WHERE RN <= 2
GROUP BY HoursCTR

编辑:我在分区中添加了一个 ORDER BY 子句,以获得两个最长的休息时间。

<小时/>

抱歉,我没有注意到您需要这个才能在 Microsoft SQL Server 2000 中工作。该版本不支持 CTE 或窗口函数。我会留下上面的答案,以防对其他人有帮助。

在 SQL Server 2000 中,常见的建议是使用相关子查询:

SELECT p1.HoursCTR, (SELECT SUM(t.Duration) FROM 
(SELECT TOP 2 p2.Duration FROM #Periods AS p2
WHERE p2.HoursCTR = p1.HoursCTR
ORDER BY p2.Duration DESC) AS t) AS LongestBreaks
FROM #Periods AS p1

关于sql - 在 SQL 中选择具有多个 GROUP 的表中 TOP 2 值的 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3823939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com