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

标签 sql sql-server set sql-server-2000

我一直在 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/

相关文章:

mysql - 今天结束了在 MySQL 中进行比较

sql - 在 SQL Server 中计算给定时间段的月份的最后几天

sql-server - 在 where 条件下使用 Sql server 列别名

php - MySQL 查询 - 将字符串与集合类型进行比较

algorithm - 纯功能集

asp.net - 如何查询具有多个根和过滤的嵌套集模型

mysql - 查询在特定时间后插入行

c# - 将字符串转换为 System.Data.SqlTypes.SqlBytes C#

sql - 如何从临时表中检索字段名称 (SQL Server 2008)

R:矩阵的交集