Максимальное значение в определенный год с объединением - PullRequest
0 голосов
/ 24 марта 2019

У меня есть две таблицы.Key равно SID в обоих - join в этой key Первая таблица содержит данные об образовании.например, SID, годовая квалификация получена (YearQual) и QualLevel.Может быть несколько rows для каждого SID

Вторая таблица имеет event data вкл.год события (EventYear) и SID

Мне нужно найти MAX QualLevel для EventYear.

Я использую SQL Server.

Я написал query после query, и я могу получить MAX QualLevel когда-либо (независимо от event year) или несколько строкпоказывая все qualification levels> = event year, когда я просто хочу MAX в этом году.

SELECT eventdata.S_ID, eventdata.eventyear,
     max (education.qual_Level) as highqual
FROM education
  left join eventdata
  ON education.S_ID = eventdata.S_ID
  WHERE  education.YearQual<= eventyear 
  GROUP BY eventyear, qual_level, eventdata.S_ID

Приведенный выше код дает несколько строк

Ответы [ 3 ]

1 голос
/ 24 марта 2019

Что мне нужно найти, так это MAX QualLevel для EventYear.

Если вы хотите MAX QualLevel и EventYear, не включайте eventdata.S_ID в свои операторы select и group by.

Поскольку у вас есть несколько S_ID для одного и того же eventyear, вы получите дубликаты записей.

Измените ваш запрос следующим образом.

SELECT  eventdata.eventyear,
        max (education.qual_Level) as highqual
FROM education
  left join eventdata
  ON education.S_ID = eventdata.S_ID
  WHERE  education.YearQual<= eventdata.eventyear 
  GROUP BY eventdata.eventyear
0 голосов
/ 24 марта 2019

Это хорошее место для использования apply:

SELECT ed.*, e.qual_Level as highqual
FROM eventdata ed OUTER APPLY
     (SELECT TOP (1) ed.*
      FROM education e
      WHERE e.S_ID = ed.S_ID AND
            e.YearQual <= ed.eventyear 
      ORDER BY e.YearQual DESC
     ) ed;
0 голосов
/ 24 марта 2019

вы можете использовать row_number()

 select S_ID,eventyear,highqual from
(SELECT eventdata.S_ID, eventdata.eventyear,
     education.qual_Level as highqual,
  row_number()over(partition by eventyear order by education.qual_Level desc) rn
FROM education
  left join eventdata
  ON education.S_ID = eventdata.S_ID
  WHERE  education.YearQual<= eventyear 
) t where t.rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...