簡體   English   中英

SQL Server 2008:前 10 名和不同的在一起

[英]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

幾個想法:

  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 邏輯。

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.valpl.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM