具有子集和分区聚合的SQL

时间:2019-02-22 19:22:46

标签: sql sql-server

我想知道是否有一种方法可以对单个select进行以下查询。

select
    z.a,
    z.SumB
from (
    select
        X.a,
        sum(X.b) over (partition by X.a) as SumB
    from (
        values
            ('hello',1),
            ('hello',2),
            ('goodbye',1)
    ) as X(a,b)
) as z
where
    z.SumB > 1
;

我的想法是,如果我能更快地消除那些行,查询可能会得到更好的优化。

以下查询无效。

select
    X.a,
    sum(X.b) over (partition by X.a)
from (
    values
        ('hello',1),
        ('hello',2),
        ('goodbye',1)
) as X(a,b)
having
     sum(X.b) over (partition by X.a) > 1
;
  

信息8121,级别16,状态1,第11行在列“ X.a”中无效   HAVING子句,因为它既不包含在任何聚合中   函数或GROUP BY子句。

     

消息4108,级别15,状态1,第11行,窗口功能只能   出现在SELECT或ORDER BY子句中。

在基本查询中是否有更好的方法来限制这些结果?

2 个答案:

答案 0 :(得分:2)

select
 X.a,
 SUM(x.B)
from (
  values
   ('hello',1),
   ('hello',2),
   ('goodbye',1)
  ) as X(a,b)
GROUP BY X.a
HAVING SUM(b)>1

答案 1 :(得分:1)

您可以尝试以下操作

with cte as

(
select
    X.a,
    sum(X.b) over (partition by X.a) as total
from (
    values
        ('hello',1),
        ('hello',2),
        ('goodbye',1)
) as X(a,b)
) select * from cte where total>1