Простая группа SQL Server по запросу - PullRequest
1 голос
/ 20 ноября 2010

У меня есть простая проблема, хотя я считаю, что она проста, я не могу понять то же самое.

Предположим, у меня есть таблица ниже с точно такими же данными, как указано ниже:

CREATE TABLE #temp
    (
    link varchar(255),
    number INT,
    fname varchar(255)            
    )

    insert into #temp VALUES ('abc',1,'f1')
    insert into #temp VALUES ('abc',2,'f2')
    insert into #temp VALUES ('abc',3,'f3')
    insert into #temp VALUES ('abc',4,'f6')
    insert into #temp VALUES ('abc',10,'f100')

    insert into #temp VALUES ('abe',-1,'f0')
    insert into #temp VALUES ('abe',1,'f1')
    insert into #temp VALUES ('abe',2,'f2')
    insert into #temp VALUES ('abe',3,'f3')
    insert into #temp VALUES ('abe',4,'f6')
    insert into #temp VALUES ('abe',20,'f200')

    insert into #temp VALUES ('cbe',-1,'f0')
    insert into #temp VALUES ('cbe',1,'f1')
    insert into #temp VALUES ('cbe',2,'f2')
    insert into #temp VALUES ('cbe',3,'f3')

Теперь для данной ссылки мне нужно получить максимальное «число» и соответствующее «имя», которое имеет максимальное «число» для данной «ссылки».

1) Пример: если ссылка 'abc', вывод должен быть abc, 10, f100

2) Пример: если ссылка, если 'abe', вывод должен быть abe, 20, f200

3) Теперь ссылка также может быть задана в виде шаблона, например (ссылка как 'ab%'), поэтому вывод должен быть

abc, 10, f100

abe, 20, f200

4) if (ссылка типа 'cb%'), поэтому вывод должен быть cbe, 3, f3

Любая помощь в написании этой группы по запросу. У меня есть решение с использованием CAST и строки concat, как показано ниже, но это, похоже, неэффективно.

select link,number,fname from #temp 
where link like 'ab%' and link+'_'+CAST(number AS varchar(255)) 
in (select link+'_'+CAST(MAX(number) AS varchar(255)) from #temp 
group by link)

Спасибо ..

1 Ответ

4 голосов
/ 20 ноября 2010

Использование самостоятельного соединения:

SELECT x.link,
       x.number,
       x.fname
  FROM #temp x
  JOIN (SELECT t.link,
               MAX(t.number) AS max_number
          FROM #temp t
      GROUP BY t.link) y ON y.link = x.link
                        AND y.max_number = x.number

Использование CTE и ROW_NUMBER (SQL Server 2005 +):

WITH cte AS (
   SELECT x.link,
          x.number,
          x.fname,
          ROW_NUMBER() OVER(PARTITION BY x.link
                                ORDER BY x.number DESC) rank
     FROM #temp x)
SELECT c.link, 
       c.number,
       c.fname
  FROM cte c
 WHERE c.rank = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...