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

时间:2014-02-10 08:34:42

标签: 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

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

试试这个

SELECT TOP 20
 * FROM tblDiagnosisMst ORDER BY DiagnosisCounter;