Как в заголовке говорится, я использую 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
То, что я хочу сделать, использовать избранную вершину n вместе с отличными значениями в идентификационном столбце. Поиск некоторых форумов говорит для использования
SELECT DISTINCT TOP 10 ...
но когда я заменяю первую строку
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
Я получаю те же результаты как без отличного слова. Что я должен делать, чтобы только добраться для отфильтровывания дублирующихся идентификационных записей?
Спасибо.
The easy option is to use group by and select min/max for all other fields
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
This can get quite tedious for wide table so the other option is to use rank over and 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 top 10 * from
(
select distinct p.id, ....
)
будет работать.
Я думаю, проблема в том, что вам нужен один результат для каждого p.id?[12105 impression Но вы получаете "дублирующиеся" результаты для некоторых 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
Тогда вам не понадобится особое ключевое слово.
DISTINCT
удаляет строки, если все выбранные значения равны. По-видимому, у вас есть записи с одинаковым p.id
, но с другим pl.nm
(или pl.val
или pl.txt_val
) ). Ответ на ваш вопрос зависит от того, какое из этих значений вы хотите отобразить в строке , в строке с вашим p.id
(первое? Наименьшее? Любое?).
Вы можете использовать общее табличное выражение, чтобы получить 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: почему вы вообще присоединяетесь к таблице "пациенты", если никогда не выбираете в ней какие-либо поля ??