Sql 仅返回最高值记录的步骤

Sql 仅返回最高值记录的步骤,sql,sql-server,median,Sql,Sql Server,Median,嗨,我正在尝试返回出现次数最多的值的记录。有了这个疑问 SELECT b.section,c.valuename ,count(a.value) as counts FROM [dbo].[SurveyResponse] a JOIN [dbo].[Questions] b ON A.qid=b.qid join [dbo].[SurveyValues] c on a.value=c.value where profileid=2 group by b.sect

嗨,我正在尝试返回出现次数最多的值的记录。有了这个疑问

SELECT b.section,c.valuename
      ,count(a.value) as counts

  FROM [dbo].[SurveyResponse] a
  JOIN [dbo].[Questions] b ON A.qid=b.qid
  join [dbo].[SurveyValues] c on a.value=c.value
  where profileid=2
  group by b.section,c.valuename
  order by 1,2
我得到以下结果:

从这个结果中,我想返回带有计数中值的节和值名称。例如,在第7、8、9行中,它应该返回值为3的第7行,因为它有更多的引用


有人能帮忙吗?

如果您将查询放在CTE中,那么您可以使用相关子查询来获得所需的结果

; with
    CTE as ( -- CTE
        SELECT    b.section
                , c.valuename
                , count(a.value) as counts
            FROM [dbo].[SurveyResponse] a
            JOIN [dbo].[Questions] b ON A.qid=b.qid
            join [dbo].[SurveyValues] c on a.value=c.value
            where profileid=2
            group by b.section,c.valuename
    )
select Section, ValueName, counts
    from CTE a
    where ValueName = ( -- Correlated Subquery
        select top 1 ValueName
            from CTE b
            where a.Section = b.Section
            order by counts desc
    )
    order by Section

根据这个例子,让我假设您希望每个部分的计数最高。这是一个简单的窗口函数应用程序:

select x.*
from (select q.section, c.valuename, count(sr.value) as counts,
             row_number() over (prtition by q.section order by count(sr.value) desc) as seqnum
      from [dbo].[SurveyResponse] sr join
           [dbo].[Questions] q
           on sr.qid = q.qid join
           [dbo].[SurveyValues] sv
           on sr.value = sv.value
      where profileid = 2
      group by q.section, c.valuename
     ) x
where seqnum = 1;

中位数不是出现次数最多的值。样本数据和期望的结果将阐明您正在尝试做的事情。可能寻找模式或从模式结果中寻找中值。。。第3 4 7 10 13行计数3模式。。因此,模式的中值为7
select x.*
from (select q.section, c.valuename, count(sr.value) as counts,
             row_number() over (prtition by q.section order by count(sr.value) desc) as seqnum
      from [dbo].[SurveyResponse] sr join
           [dbo].[Questions] q
           on sr.qid = q.qid join
           [dbo].[SurveyValues] sv
           on sr.value = sv.value
      where profileid = 2
      group by q.section, c.valuename
     ) x
where seqnum = 1;