如何使用SQL仅在结果集中排序前20条记录?

bar*_*san 0 sql sql-server sql-server-2005

我的要求是根据最常用的诊断获取诊断列表.因此,为了实现这一点,我在数据库的tblDiagnosisMst表中添加了一个名为DiagnosisCounter的列,每次用户选择它时,每个诊断增加1.所以,我的查询如下:

  select DiagnosisID,DiagnosisCode,Name from tblDiagnosisMst 
  where GroupName = 'Common' and RecStatus = 'A' order by DiagnosisCounter desc, 
  Name asc
Run Code Online (Sandbox Code Playgroud)

因此,此查询帮助我获取诊断列表,但按诊断降序排列,然后按字母顺序排列诊断名称.但是现在我的客户想要在顶部只显示20个最常用的诊断名称,然后所有名称应按字母顺序显示.但不幸的是,我陷入了困境.如果我得到你对这个问题的有用建议,那将是非常感激的.

Dam*_*ver 6

这应该做的伎俩:

;With Ordered as (
  select DiagnosisID,DiagnosisCode,Name,
    ROW_NUMBER() OVER (ORDER BY DiagnosisCounter desc) as rn
  from tblDiagnosisMst 
  where GroupName = 'Common' and RecStatus = 'A'
)
select * from Ordered
order by CASE WHEN rn <= 20 THEN rn ELSE 21 END, 
  Name asc
Run Code Online (Sandbox Code Playgroud)

我们使用ROW_NUMBER为每个行分配数字1-x,基于diagnosiscounter.然后我们将该值用于第一个ORDER BY条件(如果它在1-20中),并且所有其他行在位置上排序相同21.然后将第二个条件用作打破平局,以对那些剩余行进行排序name.