【问题标题】:Identify rows in an aggregate table that have only 1 occurrence识别聚合表中仅出现 1 次的行
【发布时间】:2020-04-09 22:08:47
【问题描述】:

我有一个如下图所示的聚合表(以及获取它的代码)。

我需要找到只出现一次的 Id 数量。如何在 SQL Server 中实现这一点?

【问题讨论】:

  • 请不要将图像用于代码或数据 - 您希望我们如何将其复制并粘贴出来以帮助您?
  • 谢谢你,戴尔,我也想这样做。
  • 请...将您的代码和数据添加为文本,然后使用编辑器中的代码格式选项。
  • 请确保您拥有两个样本数据预期的结果,以便清楚您希望完成什么。如前所述,请添加为文本而不是图像。

标签: sql sql-server group-by


【解决方案1】:

使用子查询:

select count(*)
from (select . . .
      from . . .
      group by . . .
      having count(*) = 1
     ) x;

. . . 用于查询的组件。

【讨论】:

  • 如果你看到上图,我想得到那些在输出表中只出现一次的Id。
  • 您的具体问题是:“我需要找到仅出现一次的 ID 数”。这对我来说听起来像是一个计数。在任何情况下,子查询——或者你的带有having子句的查询——都会做你想做的事。
  • 我的问题是,拿到这张表后,我需要识别只有1个NaicsCodeValue的ID
【解决方案2】:

我认为您想计算有多少ids 在现有查询的结果中只出现一次,换句话说,有多少ids 只有一个不同的NaicsCodeValue

一种选择是使用窗口函数:

select count(*)
from (
    select 
        Id, 
        NaicsCodeValue, 
        max(...) max_emp,
        count(*) over(partition by id) cnt
    from ...
    group by Id, NaicsCodeValue
) t
where cnt = 1

如果您想要原始查询中的所有行:

select *
from (
    select 
        Id, 
        NaicsCodeValue, 
        max(...) max_emp,
        count(*) over(partition by id) cnt
    from ...
    group by Id, NaicsCodeValue
) t
where cnt = 1

如果您只想要计数,也可以通过 id 聚合并按不同 NaicsCodeValue 的数量过滤来编写:

select count(*)
from (
    select 1 
    from ...
    group by Id
    having count(distinct NaicsCodeValue) = 1
) t 

这与您的原始查询有点不同,但在我看来是一种更简单的方式来获得您期望的结果(如果我理解正确)。

【讨论】:

  • 您的第二个代码确实有效。但是,是否有可能只获取那些只有一个 RepNaicscode 值的 Id。例如,Id = 10 有 3 个不同的 Naicscode 值,所以不应该计算在内
  • @Paras: 这就是查询的作用......它只为您提供ids 只有一个NaicsCodeValue 的记录。
  • 您好,感谢您的回复。如果我必须找到 2 列的最大值,它是否仍然有效,例如,如下所示: select * from ( select Id, NaicsCodeValue as RepNaicsCode, max(ThisBusinessEmployeeCount) as max_emp, MAX (ThisBusinessSalesVolume) as max_sales, count(* ) over(partition by id) cnt from #LeftIds group by Id, NaicsCodeValue ) t where cnt = 1
  • 我刚刚重新检查了代码。无论我们是否取 ThisEmployeeBusinessCount 变量的最大值,它都会给出相同的答案。我只想要 max_emp 的 1 个最大值,它只有一个 Naics 代码。 tmaximum 值可能相同,但 NaicsCodes 不同。
  • 所以基本上是这样,对于每个 Id,我检查员工人数的最大值并打印相应的 NaicsCode,如果最大值只有 1 个。但是最大值是相同的,所以会打印多个 Naicscode。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2013-02-03
相关资源
最近更新 更多