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.
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
Versuchen
SELECT distinct TOP 10 MyId FROM sometable
select top 10 p.id from(select distinct p.id from tablename)tablename
Wenige Ideen:
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.
select top 10 * from
(
select distinct p.id, ....
)
wird funktionieren.
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)
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.
SELECT TOP 14 A, B, C
FROM MyDatabase
Where EXISTS
(
Select Distinct[A] FROM MyDatabase
)
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.
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.
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
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?