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