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)
小智 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)
几个想法:
尝试这样的事情:
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 逻辑。