SQL Server 2008:TOP 10并且完全不同

use*_*301 50 sql sql-server sql-server-2008

正如标题所说,我正在使用SQL Server 2008.如果这个问题非常基础,请道歉.我只用了几天SQL.现在我有以下查询:

SELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val

from dm.labs pl
join mas_data.patients p    
  on pl.id = p.id
  where pl.nm like '%LDL%'
  and val is not null
Run Code Online (Sandbox Code Playgroud)

我想要做的是使用select顶部n和id列中的不同值.搜索一些论坛说要使用

SELECT DISTINCT TOP 10 ...
Run Code Online (Sandbox Code Playgroud)

但当我用第一行替换

SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
Run Code Online (Sandbox Code Playgroud)

我得到的结果与没有单词distinct的结果相同.我应该怎么做才能过滤掉重复的id条目?

谢谢.

小智 132

尝试

SELECT distinct TOP 10 MyId FROM sometable
Run Code Online (Sandbox Code Playgroud)

  • 感谢上帝,我一直在绿色复选标记后滚动. (12认同)
  • 有时太多过于复杂的答案,我的上帝....只是用这个人! (5认同)
  • 只好把它们换过来。非常好。 (4认同)
  • 这在 MS SQL 上不起作用:“Msg 156,Level 15,State 1,Line 1 关键字 'DISTINCT' 附近的语法不正确。”但是“SELECT different TOP 10”有效 (3认同)

小智 26

select top 10 p.id from(select distinct p.id  from tablename)tablename
Run Code Online (Sandbox Code Playgroud)


Pau*_*sey 12

简单的选择是使用group by并为所有其他字段选择min/max

SELECT TOP 10 
    p.id, 
    max(pl.nm),
    max(pl.val),
    max(pl.txt_val)
from 
    dm.labs pl
join 
    mas_data.patients p    
on 
    pl.id = p.id
  where 
    pl.nm like '%LDL%'
and 
    val is not null
group by 
    p.id
Run Code Online (Sandbox Code Playgroud)

对于宽表来说,这可能会非常繁琐,因此另一个选择是使用排名和分区

SELECT TOP 10 
    p.id, 
     pl.nm, 
     pl.val, 
   pl.txt_val, 
    rank() over(partition by p.id order by p.id) as Rank
from 
    dm.labs pl
join 
    mas_data.patients p    
on 
    pl.id = p.id
  where 
    pl.nm like '%LDL%'
and 
    val is not null
and
    Rank = 1
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是允许的.您不能引用WHERE子句中SELECT列表中创建的列. (4认同)
  • 请点击下面的Halim查看这个答案:/sf/answers/2634995961/ (4认同)
  • `简单的选择 (2认同)

Pau*_*sik 5

几个想法:

  1. 您的 select 语句中有相当多的字段。任何与另一个不同的值都会使该行与众不同。
  2. TOP 子句通常与 WHERE 子句配对。否则TOP没有多大意义。顶什么?您指定“顶部内容”的方式是使用 WHERE 进行排序
  3. 即使您使用 TOP 和 DISTINCT 以及 WHERE,也完全有可能获得相同的结果。检查以确保您查询的数据确实能够以您期望的方式进行过滤和排序。

尝试这样的事情:

SELECT DISTINCT TOP 10 p.id, pl.nm -- , pl.val, pl.txt_val
FROM dm.labs pl
JOIN mas_data.patients p    
on pl.id = p.id
where pl.nm like '%LDL%'
and val is not null
ORDER BY pl.nm
Run Code Online (Sandbox Code Playgroud)

请注意,我注释掉了一些 SELECT 以限制您的结果集和 DISTINCT 逻辑。