正如标题所说,我正在使用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条目?
谢谢。
答案 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)
很少有想法:
尝试这样的事情:
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)
在功能上与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.val
或pl.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?