Как получить максимальную дату для разных комбинаций - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь найти данные, относящиеся к максимальным данным для отдельной комбинации данных, а не к максимальной дате для всех данных.Я искал похожие проблемы, но, похоже, моя проблема в другом.Я проверил

Как выбрать строки со столбцами MAX (значение столбца), DISTINCT по MULTIPLE в SQL Получить максимальную дату - для каждой транзакции

Вот мой код, который возвращает все данные:

select top.name as [familyName], s.sportName, p.position, bottom.firstName as [firstName], a.awardAmount, a.awardDate
from familyRelation r
inner join family bottom on r.firstNameID = bottom.NameID  
inner join family top on r.familyID = top.NameID
inner join familyPosition p on p.NameID = bottom.NameID
inner join sport s on s.sportID = p.sportID 
left join awards a on a.awardID = p.familyPositionID 


familyName     sport     position   firstName   award  awardDate

Smith         tennis     umpire      mary       null     1/1/2011       
Smith         tennis     umpire      mary       100     10/20/2011       
Smith         swim       diver       mary       null     1/1/2019       
Smith         diving     diver       susan      300     1/1/2011       
Jones         rugby      player      henry      100     1/1/2016       
Jones         rugby      player      henry      150     1/1/2011       
Jones         rugby      forward     henry      190     1/1/2008       
Jones         rugby      forward     henry      100     1/1/2011
Adams         hockey     goalkeeper  grant      null     1/1/2011       
Adams         hockey     goalkeeper  grant      null     12/12/2018       
Adams         hockey     goalkeeper  grant      null     1/1/2011       
Adams         hockey     goalkeeper  grant      5750     1/1/2011

, но мне нужно вернуть данные, относящиеся к максимальной дате комбинации (family, sport, position, firstName), как показано ниже:

familyName    sport     position   firstName   award   awardDate
Smith         tennis     umpire      mary       100     10/20/2011       
Smith         swim       diver       mary       150     1/1/2019       
Smith         diving     diver       susan      300     1/1/2011       
Jones         rugby      player      henry      190     1/1/2016       
Jones         rugby      forward     henry      100     1/1/2011
Adams         hockey     goalkeeper  grant      null    12/12/2018 

Это отношения между таблицами семейства и имени. Таблица семейства.

familyId  firstNameID
100          10
100          20
200          30
300          40

таблица семейства

NameID     name
10         mary
20         susan 
30         henry
40         grant
100        smith
200        jones
300        adams

Я пробовал, но для всех используется одна и та же максимальная датастроки, которые я не хочу, потому что разные комбинации (семья, спорт, должность, имя, отчество) имеют разные максимальные даты:

select top.name as [familyName], s.sportName, p.position, bottom.firstName as [firstName], a.awardAmount, a.awardDate
from familyRelation r
inner join family bottom on r.firstNameID = bottom.NameID  
inner join family top on r.familyID = top.NameID
inner join familyPosition p on p.NameID = bottom.NameID
inner join sport s on s.sportID = p.sportID 
left join ( select awardAmount, max(awardDate) 
            from awards
            group by awardAmount) a
            on a.aID = p.p.familyPositionID

Спасибо за вашу помощь.Я не могу понять это.

обновление: я пытался использовать row_number (), но код все еще не возвращает нужные мне результаты.Мне нужно включить a.awardAmount, но как только я его добавлю, максимальная дата не будет определена, потому что суммы вознаграждений различны

select top.name as [familyName], s.sportName, p.position, bottom.firstName as [firstName], a.awardAmount, a.awardDate
, row_number() over partition by top.name, s.sportName, p.position, bottom.firstName
order by top.name, s.sportName, p.position, bottom.firstName)  
from familyRelation r
inner join family bottom on r.firstNameID = bottom.NameID  
inner join family top on r.familyID = top.NameID
inner join familyPosition p on p.NameID = bottom.NameID
inner join sport s on s.sportID = p.sportID 
left join awards a on a.awardID = p.familyPositionID 

1 Ответ

1 голос
/ 07 июня 2019

Похоже, вы ищете простую группу от -

SELECT
      top.name as [familyName], 
      s.sportName,
      p.position, 
      bottom.firstName as [firstName], 
      a.awardAmount, 
      MAX(a.awardDate) as maxDatePerGroup
from familyRelation r
    inner join family bottom on r.firstNameID = bottom.NameID  
    inner join family top on r.familyID = top.NameID
    inner join familyPosition p on p.NameID = bottom.NameID
    inner join sport s on s.sportID = p.sportID 
    left join awards a on a.awardID = p.familyPositionID 
GROUP BY top.name, s.sportName, p.position,bottom.firstName, a.awardAmount
...