SQL 中groupby多个字段怎么样才能只对其中一个字段分组

时间:2022-04-17 15:10:52
select top 20 COunt(b.id) as UpdateCount, b.AuditorDisplayName ,b.CreatorDisplayName, b.CreateTime,a.DisplayName,b.channelid from tab_news  b
left join tab_cms_channel a on b.channelid=a.id
group by b.channelid,a.DisplayName,b.AuditorDisplayName ,b.CreatorDisplayName,b.CreateTime
order by UpdateCount desc

5 个解决方案

#1


你是想在 select 列表中写多个字段,但是又想在 group by 中写一个字段 ?

#2


就想问问怎么才能写成这种效果

#3


只对其中一个值进行分组,那么其他字段的值你如何取呢?

#4


对那些没有分组的字段,你要 max 一下;

PS:好像  mysql 中可以写成楼主想要的结果,但是这些列返回的结果,都是不稳定的;

#5


用 MAX 取得的字段值不是 b 中同一条记录的值,可以用下面的方式
WITH T1 AS (
    select top 20 
           channelid,
           COunt(id) as UpdateCount
      from tab_news
  group by channelid
  order by UpdateCount desc 
)
,T2 AS (
    SELECT T1.*,
           a.DisplayName
      FROM T1
 left join tab_cms_channel a
        on T1.channelid=a.id
)
        SELECT T2.UpdateCount,
               V.AuditorDisplayName,
               V.CreatorDisplayName,
               V.CreateTime,
               T2.DisplayName,
               T2.channelid
          FROM T2
   CROSS APPLY (
                    SELECT TOP 1
                           b.AuditorDisplayName,
                           b.CreatorDisplayName,
                           b.CreateTime
                      FROM tab_news b
                     WHERE b.channelid=T2.channelid
                  ORDER BY b.id DESC -- 这是取id最大的一条
               ) V
      order by UpdateCount desc 

#1


你是想在 select 列表中写多个字段,但是又想在 group by 中写一个字段 ?

#2


就想问问怎么才能写成这种效果

#3


只对其中一个值进行分组,那么其他字段的值你如何取呢?

#4


对那些没有分组的字段,你要 max 一下;

PS:好像  mysql 中可以写成楼主想要的结果,但是这些列返回的结果,都是不稳定的;

#5


用 MAX 取得的字段值不是 b 中同一条记录的值,可以用下面的方式
WITH T1 AS (
    select top 20 
           channelid,
           COunt(id) as UpdateCount
      from tab_news
  group by channelid
  order by UpdateCount desc 
)
,T2 AS (
    SELECT T1.*,
           a.DisplayName
      FROM T1
 left join tab_cms_channel a
        on T1.channelid=a.id
)
        SELECT T2.UpdateCount,
               V.AuditorDisplayName,
               V.CreatorDisplayName,
               V.CreateTime,
               T2.DisplayName,
               T2.channelid
          FROM T2
   CROSS APPLY (
                    SELECT TOP 1
                           b.AuditorDisplayName,
                           b.CreatorDisplayName,
                           b.CreateTime
                      FROM tab_news b
                     WHERE b.channelid=T2.channelid
                  ORDER BY b.id DESC -- 这是取id最大的一条
               ) V
      order by UpdateCount desc