[英]SQL Server 2008 SELECT top 3 based on GROUP result of distinct values
[英]SQL Server 2008: TOP 10 and distinct together
正如標題所說,我使用的是 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
我想要做的是將 select top n 與 id 列中的不同值一起使用。 搜索一些論壇說要使用
SELECT DISTINCT TOP 10 ...
但是當我用
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
我得到的結果與沒有“distinct”這個詞的結果相同。 我應該怎么做才能過濾掉重復的 id 條目?
謝謝。
試試
SELECT TOP 10 distinct MyId FROM sometable;
select top 10 p.id from(select distinct p.id from tablename)tablename
簡單的選擇是使用 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
這對於寬表來說可能會變得非常乏味,因此另一種選擇是使用 rank over 和 partiion
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
幾個想法:
嘗試這樣的事情:
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 邏輯。
select top 10 * from
(
select distinct p.id, ....
)
會工作。
我知道這個線程很舊,但我想我會提出來,因為我剛剛遇到了同樣的問題。 它可能效率不高,但我相信它可以完成工作。
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)
好吧,我沒想到,但是 Halim 的 SELECT 獨特的 TOP 10 MyId FROM sometable
在功能上與 Vaishnavi Kumar 的 select top 10 p.id from(select distinct p.id from tablename)tablename 相同
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
奇怪的是 select top 5 distinct 是無效的,但是 select distinct top 5 是並且可以像您期望的 select top 5 distinct 一樣工作。
SELECT TOP 14 A, B, C
FROM MyDatabase
Where EXISTS
(
Select Distinct[A] FROM MyDatabase
)
如果所有選定的值都相等,則DISTINCT
將刪除行。 顯然,您的條目具有相同的p.id
但具有不同的pl.nm
(或pl.val
或pl.txt_val
)。 在回答你的問題取決於你想要的行與您的顯示這些值之一p.id
(第一?最小?否?)。
我認為問題在於您希望每個 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
那么就不需要不同的關鍵字了。
您可以使用通用表表達式來獲取前 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:如果您從不從中選擇任何字段,您為什么還要加入“患者”表?
這是正確的答案,您可以從表中找到 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
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
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.