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

时间:2009-12-17 22:57:19

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

我想要做的是在id列中选择top n和不同的值。搜索一些论坛说要使用

SELECT DISTINCT TOP 10 ...

但是当我用

替换第一行时
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val

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

谢谢。

13 个答案:

答案 0 :(得分:122)

尝试

SELECT distinct TOP 10 MyId FROM sometable

答案 1 :(得分:26)

select top 10 p.id from(select distinct p.id  from tablename)tablename

答案 2 :(得分:11)

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

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

答案 3 :(得分:4)

很少有想法:

  1. 您的select语句中有很多字段。任何与另一个值不同的值都会使该行不同。
  2. TOP子句通常与WHERE子句配对。否则TOP并不意味着什么。最重要的是什么?您使用WHERE
  3. 指定“排序”的方式是排序
  4. 即使您使用TOP和DISTINCT以及WHERE,也可以获得相同的结果。检查以确保您查询的数据确实能够按照您期望的方式进行过滤和排序。
  5. 尝试这样的事情:

    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逻辑。

答案 4 :(得分:3)

select top 10 * from
(
    select distinct p.id, ....
)

会奏效。

答案 5 :(得分:2)

我知道这个帖子已经老了,但是我觉得自从我遇到同样的问题后我会抛出所提出的内容。它可能效率不高,但我相信它可以完成工作。

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)

答案 6 :(得分:2)

好吧,我不会期待它,但哈利姆     选择不同的TOP 10 MyId FROM sometable

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

中选择前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名不同有效。

答案 7 :(得分:0)

如果所有选定值相等,则

DISTINCT会删除行。显然,您的条目具有相同的p.id但具有不同的pl.nm(或pl.valpl.txt_val)。您的问题的答案取决于您希望在 one 行中使用p.id显示这些值中的哪一个(第一个?最小的?任何?)。

答案 8 :(得分:0)

我认为问题是你想为每个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关键字。

答案 9 :(得分:0)

您可以使用公用表表达式获取前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:如果你从不选择任何字段,为什么你甚至加入“病人”表?

答案 10 :(得分:0)

SELECT TOP 14 A, B, C
  FROM MyDatabase
  Where EXISTS 
   (
     Select Distinct[A] FROM MyDatabase
    )

答案 11 :(得分:0)

这是正确的答案,你可以从表中找到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

答案 12 :(得分:-1)

/build.sbt:131: error: No implicit for Append.Value[Seq[java.io.File], sbt.Def.Initialize[java.io.File]] found,
  so sbt.Def.Initialize[java.io.File] cannot be appended to Seq[java.io.File]
unmanagedResourceDirectories in Assets += gruntDirectory { _ / "node_modules"}
                                       ^
[error] Type error in expression
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?