SQL Group By和窗口函数

Posted

技术标签:

【中文标题】SQL Group By和窗口函数【英文标题】:SQL Group By and window function 【发布时间】:2014-03-21 10:35:24 【问题描述】:

我在 SQL 语句上有点挣扎,希望有人愿意为我指明正确的方向。

下面是我的桌子图片:

正如您在此处看到的,我有一个名为“状态”的列。基本上,我想将与特定 BuildID 关联的所有“状态”分组,并将它们显示在我的 SQL 输出的额外列中。

我很近,但不完全在那里。

在下一张图片中是我用来尝试实现此目的的语句示例:

正如您在此处看到的,它完成了 SUM 并添加了 TotalTime 并创建了我需要的额外列。但是,它没有将它们全部分组到一条记录中,而是为每个 BuildID 创建了 2 行额外的行。一条记录的值为“正在运行”状态,另一条记录的值为“中断”状态,另一条记录的两个状态均包含值 0。

现在我想要它为每个 BuildID 将它分组到一个记录中。就像我在下面添加的图片:

上图是我希望记录的显示方式。但问题是我添加了 WHERE [State] = Running,我知道这是错误的,但只是以此为例。如您所见,“Break”列没有任何价值。

我希望这是有道理的,并希望有人能指出我正确的方向吗?

这是一个关于 SQL fiddle http://sqlfiddle.com/#!3/7b6b9/2的例子

感谢您花时间阅读本文:)

【问题讨论】:

【参考方案1】:

已经对sql进行了一些细化,开始吧:

SELECT BuildID,Product, Program, 
  sum(CASE WHEN State = 'Running' THEN cast(TotalTime as INT) ELSE 0 END) AS Running
  , sum(CASE WHEN State = 'Break' THEN cast(TotalTime as INT) ELSE 0 END) AS Breakt
FROM Line1Log
GROUP BY BuildID,Product, Program

请查看SQLFiddle

不确定我是否遗漏了什么:-),但解决方案看起来很简单。告诉我。

【讨论】:

【参考方案2】:

将您的 SUM() OVER(PARTITION BY...) 从 CASE 中移出

SQL fiddle

select BuildID, Product, Program, Sum(Running) Running, Sum([Break]) [Break]
from (
    SELECT Distinct BuildID, Product, Program, 
    Sum(Case when [State]='Running' Then TotalTime Else 0 END) OVER (Partition by [State], [BuildID]) Running,
    Sum(Case when [State]='Break' Then TotalTime Else 0 END) OVER (Partition by [State], [BuildID]) [Break]

    From Line1Log) T
group by BuildID, Product, Program

【讨论】:

感谢您的回答,但这给了我与上面添加的图像相同的结果,它将这些添加到列中,但将它们全部显示为单独的记录 奇怪。它必须工作正常。你能为你的数据和请求构建 SQL fiddle 吗? 也完美 :) 再次感谢您的帮助,这对我帮助很大,我非常感谢您的时间和精力 :) 再次感谢!【参考方案3】:

其他一切都好,为什么要将所有列分组?,试试这个,

Select BuidId,Product,program,Sum(Running),Sum(Break)
(......
.....
......) as T
group by BuidId,Product,program

【讨论】:

感谢您的回答,但不幸的是,这对我不起作用,因为尚未创建 Running 和 Break 列。这些额外的列是在 select 语句之后创建的。

以上是关于SQL Group By和窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

在窗口函数中使用不在 Group By 中的列,我得到: SQL 编译错误:[COLUMN_A] is not a valid group by expression

为啥在窗口函数中使用 GROUP BY

PostgreSQL中group by中的窗口函数

在 Amazon Redshift 中使用窗口函数时需要 GROUP BY 聚合

Group BY 查询使用索引,但窗口函数查询不使用

Django ORM group by,并找到每个组的最新项目(窗口函数)