SQL Server 2008: ТОП 10 и отличные вместе - PullRequest
48 голосов
/ 18 декабря 2009

Как видно из названия, я использую 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

Я получаю те же результаты, что и без слова отличного. Что я должен делать, чтобы только отфильтровать дублирующиеся записи идентификаторов?

Спасибо.

Ответы [ 13 ]

0 голосов
/ 18 декабря 2009

Вы можете использовать общее табличное выражение, чтобы получить 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: почему вы даже присоединяетесь к таблице «пациентов», если вы никогда не выбираете из нее какие-либо поля ??

0 голосов
/ 18 декабря 2009

Я думаю, проблема в том, что вы хотите один результат для каждого 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

Тогда не нужно отдельное ключевое слово.

0 голосов
/ 18 декабря 2009

DISTINCT удаляет строки, если все выбранные значения равны. По-видимому, у вас есть записи с тем же p.id, но с другими pl.nm (или pl.val или pl.txt_val). Ответ на ваш вопрос зависит от того, какое из этих значений вы хотите отобразить в строке one с вашим p.id (первым - самым маленьким - любым?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...