Получение отфильтрованных результатов с помощью подзапроса - PullRequest
1 голос
/ 15 июня 2010

У меня есть таблица с чем-то вроде следующего:

ID Name Color  
------------
1 Bob Blue  
2 John Yellow  
1 Bob Green  
3 Sara Red  
3 Sara Green

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

ID Name Color  
------------
1 Bob Blue  
2 John Yellow  
3 Sara Red  

т.е. Я хотел бы вернуть 1 строку на пользователя. (Я не против, какая строка возвращается для конкретного пользователя - мне просто нужно, чтобы [ID] был уникальным.) У меня уже есть кое-что, что работает, но очень медленно, когда я создаю временную таблицу, добавляя все идентификаторы и затем используя «OUTER APPLY» выбирает верхнюю 1 из той же таблицы, то есть

CREATE TABLE #tb  
(  
    [ID] [int]  
)  

INSERT INTO #tb  
select distinct [ID] from MyTable

select 
    T1.[ID],
    T2.[Name],
    T2.Color  
from  
    #tb T1
    OUTER APPLY 
    (
        SELECT TOP 1 * FROM MyTable T2 WHERE T2.[ID] = T1.[ID]
    ) AS V2


DROP TABLE #tb

Может кто-нибудь подсказать, как мне это улучшить?

Спасибо

Ответы [ 2 ]

1 голос
/ 15 июня 2010

Попробуйте:

WITH CTE AS 
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS 'RowNo', 
ID, Name, Color
FROM table
)
SELECT ID,Name,color
FROM CTE
WHERE RowNo = 1

или

select 
  *
from
(
    Select 
      ID, Name, Color,
      rank() over (partition by Id order by sum(Name) desc) as Rank
    from 
      table
    group by 
      ID
) 
  HRRanks
where
  rank = 1
0 голосов
/ 15 июня 2010

Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать функции ранжирования и просто получить первую в списке.

http://msdn.microsoft.com/en-us/library/ms189798.aspx

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