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 ]

125 голосов
/ 05 июня 2016

Попробуйте

SELECT distinct TOP 10 MyId FROM sometable
26 голосов
/ 29 ноября 2013
select top 10 p.id from(select distinct p.id  from tablename)tablename
11 голосов
/ 18 декабря 2009

Простой вариант - использовать group by и выбирать 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
4 голосов
/ 18 декабря 2009

Мало идей:

  1. У вас довольно много полей в вашем операторе выбора. Любое значение, отличное от другого, сделает эту строку отличной.
  2. TOP-предложения обычно сочетаются с WHERE-предложениями. В противном случае ТОП мало что значит. Вершина чего? Способ, которым вы указываете «верхнюю часть чего», заключается в сортировке с использованием WHERE
  3. Вполне возможно получить те же результаты, даже если вы используете 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.

3 голосов
/ 18 декабря 2009
select top 10 * from
(
    select distinct p.id, ....
)

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

2 голосов
/ 02 ноября 2016

ну, я бы этого не ожидал, но Халим ВЫБЕРИТЕ различный ТОП 10 MyId ИЗ sometable

функционально идентичен Вайшнави Кумару выберите top 10 p.id из (выберите отличный p.id из имени таблицы) 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

Любопытно, что выбор лучших 5 отличных недопустим, но выбор отличных 5 лучших и работает, как вы могли ожидать, выберите лучшие 5 отличных для работы.

2 голосов
/ 13 июля 2012

Я знаю, что эта ветка старая, но решила, что я добавлю то, что придумала, так как я столкнулась с этой же проблемой. Это может быть неэффективно, но я верю, что оно выполнит свою работу.

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)
0 голосов
/ 27 февраля 2019
SELECT DISTINCT * FROM (

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

)
0 голосов
/ 08 ноября 2015

Это правильный ответ, и вы можете найти значение 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
0 голосов
/ 23 апреля 2013
SELECT TOP 14 A, B, C
  FROM MyDatabase
  Where EXISTS 
   (
     Select Distinct[A] FROM MyDatabase
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...