首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过HAVING条件过滤原始行?

如何通过HAVING条件过滤原始行?
EN

Stack Overflow用户
提问于 2011-12-30 07:23:44
回答 3查看 88关注 0票数 3

在T-SQL中选择受HAVING属性限制的原始值的方法是什么?例如,如果我有

代码语言:javascript
运行
复制
A|B
10|1
11|2
10|3

我如何获得B的所有值(不是平均值或其他汇总统计数据),按A分组,计数(A的出现次数)大于或等于2?

EN

回答 3

Stack Overflow用户

发布于 2011-12-30 07:26:41

实际上,您有几个选项可供选择

1.您可以从原始的having语句生成子查询,并将其连接回表

代码语言:javascript
运行
复制
SELECT *
FROM   YourTable yt
       INNER JOIN (
         SELECT A
         FROM   YourTable
         GROUP BY
                A
         HAVING COUNT(*) >= 2
       ) cnt ON cnt.A = yt.A

另一个等效的解决方案是使用WITH子句。

代码语言:javascript
运行
复制
  ;WITH cnt AS (
    SELECT A
    FROM   YourTable
    GROUP BY
           A
    HAVING COUNT(*) >= 2
  )
      SELECT *
      FROM   YourTable yt
             INNER JOIN cnt ON cnt.A = yt.A

3.或者您可以使用IN语句

代码语言:javascript
运行
复制
      SELECT *
      FROM   YourTable yt
      WHERE  A IN (SELECT A FROM YourTable GROUP BY A HAVING COUNT(*) >= 2)
票数 3
EN

Stack Overflow用户

发布于 2011-12-30 07:27:44

自连接将起作用:

代码语言:javascript
运行
复制
select B
from table
join(
  select A
  from table
  group by 1
  having count(1)>1
)s
using(A);
票数 2
EN

Stack Overflow用户

发布于 2011-12-30 08:00:27

您可以使用窗口函数(无连接,只有一次表扫描):

代码语言:javascript
运行
复制
select * from (
  select *, cnt=count(*) over(partiton by A) from table
) as a 
where cnt >= 2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8674668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档