【问题标题】:show extra columns where group has count of 1显示组计数为 1 的额外列
【发布时间】:2020-04-10 12:13:59
【问题描述】:

假设我有一个表Students,只有两列LastNameFirstName。我知道我可以得到所有只有 1 个 FirstNameLastNames:

select LastName from Students group by LastName having count(*) = 1

但是,如果我还想显示这些行的名字怎么办?

【问题讨论】:

  • 您是否尝试过像这样在选择语句中包含名字:从学生组中选择姓氏,名字,按姓氏计数(*)= 1
  • @LemuelBotha,您不能包含不是聚合函数或不在按列分组中的列
  • 哦,是的,你是对的

标签: sql group-by count subquery window-functions


【解决方案1】:

您可以使用相关子查询进行过滤:

select s.* 
from students s
where (select count(*) from students s1 where s1.LastName = s.LastName) = 1

或者,如果你有一个主列,你可以使用not exists

select s.*
from student s
where not exists (
    select 1 from students s1 where s1.LastName = s.LastName and s1.id <> s.id
)

此查询将利用(id, LastName) 上的索引。

最后,另一个常见的选择是计算窗口:

select *
from (select s.*, count(*) over(partition by LastName) cnt from students s) t
where cnt = 1

【讨论】:

    【解决方案2】:

    你也可以这样做

    Select * from Students where lastname in (Select lastname from Students group by lastname having count(*) =1)
    

    【讨论】:

      【解决方案3】:

      只需将其添加到select

      select s.LastName, min(s.firstname)
      from Students s
      group by s.LastName
      having count(*) = 1;
      

      如果只有一行匹配,则min() 返回该行的值。

      【讨论】:

        【解决方案4】:

        您需要使用任何可以返回所需值的聚合函数来获取它。 Min, Max, first_value(), ir string_agg() 在其他用例中您可能希望所有名称都带有姓氏

        select LastName, 
        first_value(firstname) over (order by firstname) firstname,
        Min(firstname)
        from Students 
        group by LastName having count(*) = 1
        

        【讨论】:

          【解决方案5】:

          我自己找到了另一个:

          with LastNames as (
            select LastName from Students group by LastName having count(*) = 1
          )
          select LastName, FirstName from Students
            where LastName in (select LastName from LastNames)
          

          【讨论】:

            猜你喜欢
            • 2023-03-15
            • 1970-01-01
            • 2021-11-08
            • 1970-01-01
            • 2022-08-12
            • 2020-10-12
            • 1970-01-01
            • 2020-08-27
            • 1970-01-01
            相关资源
            最近更新 更多