Подтвердить что ты не робот

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

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

Спасибо.

4b9b3361

Ответ 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