【问题标题】:Using sub-query within select clause of outer query with group by在带有 group by 的外部查询的 select 子句中使用子查询
【发布时间】:2020-06-19 00:21:45
【问题描述】:

假设我有两列“col1”和“col2”。

这是多对多的关系。

设 col2 有 'A' ,'B' & 'C' 三种值

现在我通过 col1 执行分组,我想为 col 1 中的每一行获取 col2 的 A、B、C 的最大计数

例如:

Col1 | col2
-----+--------------
1.   | A
1.   | A
1.   | B
2.   | C

结果

COL1 | COL2
-----+------
1.   | A
2.   | C

我尝试在外部查询的 select 子句中按子查询编写分组,但我认为它不支持。

不明白。

【问题讨论】:

  • select distinct col1, col2 from ...?
  • 我建议指出你正在使用的sql server类型:mysql、sql server、postgresql等

标签: sqlite


【解决方案1】:

尝试使用 Temp Table 和 Top 1

SELECT [col2],COUNT(col1) AS mycount into #TMPA FROM [TESTDB].[dbo].[tbltest] GROUP BY col1,col2 select top 1 * from #TMPA GROUP BY col2,mycount drop table #TMPA

【讨论】:

    【解决方案2】:

    您似乎想要“模式”——每个col1col2 最常见的值。您可以使用窗口函数:

    select col2 as col2_mode, count(*)
    from (select col1, col2, count(*) as cnt,
                 row_number() over (partition by col1 order by count(*)) as seqnum
          from t
         ) t
    where seqnum = 1
    group by col2;
    

    如果有最常见的关系,这将任意选择其中一个。如果您想要所有这些,请使用rank() 而不是row_number()

    【讨论】:

      【解决方案3】:

      带有ROW_NUMBER()窗口功能:

      select col1, col2
      from (
        select col1, col2,
          row_number() over (partition by col1 order by count(*) desc)  rn
        from tablename
        group by col1, col2
      )
      where rn = 1
      

      如果您希望在结果中包含平局,请使用 DENSE_RANK() 而不是 ROW_NUMBER()
      请参阅demo
      结果:

      | col1 | col2 |
      | ---- | ---- |
      | 1    | A    |
      | 2    | C    |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 2018-09-07
        相关资源
        最近更新 更多