it-swarm.com.de

SQL Server 2008: TOP 10 und eindeutig zusammen

Wie der Titel schon sagt, verwende ich SQL Server 2008. Wenn diese Frage sehr einfach ist, dann bitte. Ich benutze SQL erst seit ein paar Tagen. Im Moment habe ich folgende Abfrage:

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

Ich möchte select top n zusammen mit unterschiedlichen Werten in der Spalte id verwenden. Das Durchsuchen einiger Foren bedeutet zu verwenden

SELECT DISTINCT TOP 10 ...

aber wenn ich die erste Zeile mit ersetze

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

Ich bekomme die gleichen Ergebnisse wie ohne das Wort zu unterscheiden. Was muss ich tun, um nur doppelte ID-Einträge herauszufiltern?

Vielen Dank.

44
raoulcousins

Die einfache Option ist die Verwendung von group by und die Auswahl von min/max für alle anderen Felder

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

Dies kann bei breiten Tischen recht langweilig werden, daher ist die andere Option Rangfolge und Partition

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
10
Paul Creasey

Versuchen

SELECT distinct TOP 10 MyId FROM sometable
115
Halim
select top 10 p.id from(select distinct p.id  from tablename)tablename
26
Vaishnavi Kumar

Wenige Ideen:

  1. Sie haben einige Felder in Ihrer select-Anweisung. Jeder Wert, der sich von einem anderen unterscheidet, unterscheidet diese Zeile.
  2. TOP-Klauseln werden normalerweise mit WHERE-Klauseln gepaart. Ansonsten bedeutet TOP nicht viel. Top von was? Die Art und Weise, wie Sie "top of what" angeben, ist die Sortierung mithilfe von WHERE
  3. Es ist durchaus möglich, dieselben Ergebnisse zu erzielen, obwohl Sie TOP und DISTINCT und WHERE verwenden. Stellen Sie sicher, dass die von Ihnen abgefragten Daten tatsächlich in der von Ihnen erwarteten Weise gefiltert und sortiert werden können.

Versuchen Sie etwas so:

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

Beachten Sie, dass ich einige SELECT-Elemente auskommentiert habe, um die Ergebnismenge und die DISTINCT-Logik zu begrenzen.

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

wird funktionieren.

3
cdonner

Ich weiß, dass dieser Thread alt ist, aber ich dachte, ich würde das, was herausgekommen ist, einwerfen, da ich gerade auf dieses Thema gestoßen bin. Es ist vielleicht nicht effizient, aber ich glaube, dass es die Arbeit erledigt.

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)
2
Jeff

nun, ich hätte es nicht erwartet, aber Halims SELECT eindeutige TOP 10 MyId FROM-Option

ist funktional identisch mit Vaishnavi Kumar's Wählen Sie die ersten 10 ID-IDs aus (wählen Sie die eindeutige S.ID aus dem Tabellennamen aus) Tabellenname 

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

erzeugt die gleichen Ergebnisse für beide Selektionen:

    name
1   bob
2   jim
3   john
4   luke
5   mark

es ist merkwürdig, dass die Auswahl von Top-5-Elementen nicht gültig ist, aber die Auswahl von Top-5-Elementen ist und funktioniert so, wie Sie vielleicht erwarten, dass Sie die Auswahl von Top-5-Dateien treffen können.

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

DISTINCT entfernt Zeilen, wenn alle ausgewählte Werte gleich sind. Anscheinend haben Sie Einträge mit demselben p.id, aber mit unterschiedlichem pl.nm (oder pl.val oder pl.txt_val). Die Antwort auf Ihre Frage hängt davon ab, welchen dieser Werte Sie in der Zeile one mit Ihrem p.id (dem ersten "kleinsten" beliebigen) anzeigen möchten.

0
Heinzi

Ich denke, das Problem ist, dass Sie für jede p.id ein Ergebnis wünschen?

Aber Sie erhalten "doppelte" Ergebnisse für einige p.ids, stimmt das?

Das Schlüsselwort DISTINCT gilt für die gesamte Ergebnismenge, also für pl.nm, pl.val, pl.txt_val und nicht nur für p.id.

Du brauchst so etwas 

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

Benötigt dann das eindeutige Schlüsselwort nicht.

0
MikeW

Dies ist die richtige Antwort und Sie können 3 Höhenwerte aus der Tabelle finden

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
0
Hafiz Asad

Sie können einen Common Table-Ausdruck verwenden, um die ersten 10 verschiedenen IDs zu ermitteln und diese dann mit den restlichen Daten zu verknüpfen:

;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

Das sollte funktionieren. Allerdings: Wenn Sie eine "TOP x" -Klausel haben, benötigen Sie normalerweise auch eine ORDER BY-Klausel. Wenn Sie die TOP 10 möchten, müssen Sie dem System in der Reihenfolge mitteilen, in der "TOP" steht.

PS: Warum treten Sie sogar der Tabelle "Patienten" bei, wenn Sie niemals Felder aus ihr auswählen?

0
marc_s