SQL Server 2008: TOP 10 и отчетливые
Как говорится в заголовке, я использую 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
Я получаю те же результаты, что и без слова. Что мне делать, только чтобы отфильтровать дубликаты идентификационных записей?
Спасибо.
Ответы
Ответ 1
Легким вариантом является использование группы по и выбора 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
Это может стать довольно утомительным для широкой таблицы, поэтому другой вариант заключается в использовании ранжирования и 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
Ответ 2
Try
SELECT distinct TOP 10 MyId FROM sometable
Ответ 3
select top 10 p.id from(select distinct p.id from tablename)tablename
Ответ 4
Немногие идеи:
- У вас есть довольно много полей в вашем заявлении select. Любое значение, отличное от другого, сделает эту строку отличной.
- Предложения TOP обычно связаны с предложениями WHERE. В противном случае TOP не означает многого. Что из чего? Способ, которым вы указываете "вершину", чтобы сортировать с помощью WHERE
- Полностью можно получить те же результаты, даже если вы используете 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.
Ответ 5
Я знаю, что эта ветка устарела, но подумал, что я бы выбрал то, что придумал, так как я просто столкнулся с этой проблемой. Это может быть неэффективно, но я считаю, что он выполняет свою работу.
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
select top 10 * from
(
select distinct p.id, ....
)
будет работать.
Ответ 7
ну, я бы этого не ожидал, но Халим SELECT четко TOP 10 MyId FROM sometable
функционально идентична функции Вайшнави Кумара выберите top 10 p.id from (выберите отдельный p.id из 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 недействителен, но выберите отличный верх 5 и работает так, как вы могли ожидать, чтобы выбрать топ 5, отличный от работы.
Ответ 8
DISTINCT
удаляет строки, если все выбранные значения равны. По-видимому, у вас есть записи с тем же p.id
, но с разными pl.nm
(или pl.val
или pl.txt_val
). Ответ на ваш вопрос зависит от того, какое из этих значений вы хотите показать в одной строке с вашим p.id
(первым? Наименьшим? Any?).
Ответ 9
Я думаю, проблема в том, что вы хотите получить один результат для каждого 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
Вы можете использовать выражение Common Table, чтобы получить 10 лучших идентификаторов, а затем присоединить их к остальным данным:
;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: почему вы даже присоединяетесь к таблице "пациенты", если вы никогда не выбираете какие-либо поля из этого?
Ответ 11
SELECT TOP 14 A, B, C
FROM MyDatabase
Where EXISTS
(
Select Distinct[A] FROM MyDatabase
)
Ответ 12
Это правильный ответ, и вы можете найти 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