SQL Server 2008:TOP 10与众不同

如标题所示,我使用的是SQL Server2008。如果这个问题很基础,我深表歉意。 我只用了几天的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

我想做的是在ID列中使用select top n以及不同的值。 通过一些论坛搜索说要使用

SELECT DISTINCT TOP 10 ...

但是当我将第一行替换为

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

我得到的结果与不使用“不同”一词的结果相同。 我应该怎么做才能只过滤出重复的ID条目?

谢谢。

user327301 asked 2020-01-24T10:30:31Z
13个解决方案
130 votes

尝试

SELECT distinct TOP 10 MyId FROM sometable
Halim answered 2020-01-24T10:31:06Z
26 votes
select top 10 p.id from(select distinct p.id  from tablename)tablename
Vaishnavi Kumar answered 2020-01-24T10:31:21Z
12 votes

简单的选项是使用分组依据,并为所有其他字段选择最小值/最大值

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

对于宽表来说这可能会很繁琐,所以另一种选择是使用排名和参与

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
Paul Creasey answered 2020-01-24T10:30:46Z
4 votes

几个想法:

  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

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

Paul Sasik answered 2020-01-24T10:32:04Z
3 votes
select top 10 * from
(
    select distinct p.id, ....
)

将工作。

cdonner answered 2020-01-24T10:32:24Z
2 votes

我知道这个线程很旧,但是自从遇到同样的问题以来,我想我会提出一些想法。 它可能没有效率,但是我相信它可以完成工作。

SELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
INTO #yourTempTable
from dm.labs pl 
join mas_data.patients p on pl.id = p.id   
where pl.nm like '%LDL%' and val is not null

select p.id, pl.nm, pl.val, pl.txt_val
from #yourTempTable
where id IN (select distinct id from #yourTempTable)
Jeff answered 2020-01-24T10:32:44Z
2 votes

好吧,我本来没想到,但是哈利姆(Halim)     从某表中选择不同的前十名MyId

在功能上与Vaishnavi Kumar的相同     从(从表名中选择不同的p.id)中选择前10个p.id

create table #names ([name] varchar(10))
insert into #names ([name]) values ('jim')
insert into #names ([name]) values ('jim')
insert into #names ([name]) values ('bob')
insert into #names ([name]) values ('mary')
insert into #names ([name]) values ('bob')
insert into #names ([name]) values ('mary')
insert into #names ([name]) values ('john')
insert into #names ([name]) values ('mark')
insert into #names ([name]) values ('matthew')
insert into #names ([name]) values ('luke')
insert into #names ([name]) values ('peter')

select distinct top 5 [name] from #names

select top 5 * from (select distinct [name] from #names) subquery 

drop table #names

对于两个选择产生相同的结果:

    name
1   bob
2   jim
3   john
4   luke
5   mark

奇怪的是,选择前5个唯一关键字是无效的,但是选择前5个唯一关键字仍然有效,并且您可能希望选择前5个唯一关键字有效。

answered 2020-01-24T10:33:18Z
0 votes

如果所有选定值均相等,则DISTINCT删除行。 显然,您具有的条目具有相同的p.id,但具有不同的pl.nm(或pl.valpl.txt_val)。 问题的答案取决于您要与p.id(第一个?最小的?任何一个?)一起显示在这些值中的哪一个。

Heinzi answered 2020-01-24T10:33:38Z
0 votes

我认为问题是每个p.id都需要一个结果?

但是,对于某些p.id,您将获得“重复”结果,对吗?

DISTINCT关键字适用于整个结果集,因此适用于pl.nm,pl.val,pl.txt_val,而不仅仅是p.id。

你需要像

SELECT TOP 10 p.id, max( p1.nm ), max (p1.val), ...
FROM ...
GROUP BY p.id

则不需要distinct关键字。

MikeW answered 2020-01-24T10:34:16Z
0 votes

您可以使用通用表表达式来获取前10个不同的ID,然后将其与其余数据连接起来:

;WITH TopTenIDs AS
( 
   SELECT DISTINCT TOP 10 id
   FROM dm.labs 
   ORDER BY ......
)
SELECT 
    tti.id, pl.nm, pl.val, pl.txt_val
FROM
    TopTenIDs tti
INNER JOIN
    dm.labs pl ON pl.id = tti.id
INNER JOIN 
    mas_data.patients p ON pl.id = p.id
WHERE
    pl.nm like '%LDL%'
    AND val IS NOT NULL

那应该工作。 请注意:如果您有“ TOP x”子句,通常还需要一个ORDER BY子句-如果要使用TOP 10,则需要以“ TOP”的顺序告诉系统。

PS:如果您从中未选择任何字段,为什么还要加入“患者”表?

marc_s answered 2020-01-24T10:34:45Z
0 votes
SELECT TOP 14 A, B, C
  FROM MyDatabase
  Where EXISTS 
   (
     Select Distinct[A] FROM MyDatabase
    )
SQLServer answered 2020-01-24T10:35:00Z
0 votes

这是正确的答案,您可以从表格中找到3个高度值

SELECT TOP(1)  T.id FROM (SELECT DISTINCT TOP(3) st.id  FROM Table1 AS t1 , Table2 AS t2 WHERE t1.id=t2.id ORDER BY (t2.id) DESC ) T ORDER BY(T.id) ASC
Hafiz Asad answered 2020-01-24T10:35:20Z
-1 votes
SELECT DISTINCT * FROM (

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

)
Mark Sancho answered 2020-01-24T10:35:36Z
translate from https://stackoverflow.com:/questions/1925176/sql-server-2008-top-10-and-distinct-together