Получение верхней строки для каждой уникальной группы в запросе внутренней объединенной группы - PullRequest
1 голос
/ 09 ноября 2010

стол 1

id    name   class
1     ab     A
2     cd     A
3     ef     B    
4     ab     B
5     cd     B

Таблица 2

name   test   marks
ab     1      90
ab     2      70
cd     2      80
cd     3      85
ef     3      85
ef     4      60

Привет, у меня есть две таблицы выше, мой вопрос в том, какой самый эффективный / лучший или самый простой способ получить наивысшие оценки из таблицы 2 для каждого человека и присоединиться к таблице 1, что приводит к:

id   name   class    [highest marks]
1    ab     A        90
2    cd     A        85
3    ef     B        85

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Предполагается, что SQL Server 2005+ использует функции аналитики / ранжирования / управления окнами:

WITH example AS (
  SELECT a.id,
         a.name,
         a.class,
         b.marks,
         ROW_NUMBER() OVER(PARTITION BY a.id
                               ORDER BY b.marks DESC) AS rank
    FROM TABLE_1 a
    JOIN TABLE_2 b ON b.name = a.name)
SELECT e.id,
       e.name,
       e.class,
       e.marks
  FROM example e
 WHERE e.rank = 1

Использование агрегатов:

SELECT a.id,
       a.name,
       a.class,
       b.marks      
  FROM TABLE_1 a
  JOIN (SELECT t.name,
               MAX(t.mark) AS max_mark
          FROM TABLE_2
      GROUP BY t.name) b ON b.name = a.name
0 голосов
/ 09 ноября 2010

Другой вариант, если вы не хотите использовать CTE (Common Table Expressions)

SELECT table1.id, table1.name, table1.class, MAX(table2.marks) AS [highest marks]
FROM table1 INNER JOIN
table2 ON table1.name = table2.name
GROUP BY table1.id, table1.name, table1.class
...