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

То, что я хочу сделать, использовать избранную вершину n вместе с отличными значениями в идентификационном столбце. Поиск некоторых форумов говорит для использования

SELECT DISTINCT TOP 10 ...

но когда я заменяю первую строку

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

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

Спасибо.

50
задан marc_s 17 December 2009 в 20:12
поделиться

6 ответов

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
12
ответ дан 7 November 2019 в 10:28
поделиться

Несколько идей:

  1. У вас довольно много полей в вашем операторе select. Любое значение, отличное от другого, сделает эту строку отличной.
  2. Предложения TOP обычно сочетаются с предложениями WHERE. В противном случае ТОП ничего не значит. Сверху чего? Вы указываете «верхнюю часть чего», используя сортировку с помощью WHERE
  3. . Вполне возможно получить те же результаты, даже если вы используете TOP, DISTINCT и WHERE.
4
ответ дан 7 November 2019 в 10:28
поделиться
select top 10 * from
(
    select distinct p.id, ....
)

будет работать.

3
ответ дан 7 November 2019 в 10:28
поделиться

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

Тогда вам не понадобится особое ключевое слово.

0
ответ дан 7 November 2019 в 10:28
поделиться

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

0
ответ дан 7 November 2019 в 10:28
поделиться

Вы можете использовать общее табличное выражение, чтобы получить 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
ответ дан 7 November 2019 в 10:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: