There are the following tables:
CREATE TABLE SportTypes( SportTypeID INTEGER NOT NULL PRIMARY KEY, SportTypeName VARCHAR(30)); CREATE TABLE Sportsmans( SportsmanID INTEGER NOT NULL PRIMARY KEY, FirstName VARCHAR(50) NOT NULL, MiddleName VARCHAR(50), LastName VARCHAR(50) NOT NULL, SportTypeID INTEGER NOT NULL, CONSTRAINT fk_sporttype FOREIGN KEY (SportTypeID) REFERENCES SportTypes(SportTypeID)); CREATE TABLE Competitions( CompetitionID INTEGER NOT NULL PRIMARY KEY, CompetitionName VARCHAR(50) NOT NULL, Season VARCHAR(30) NOT NULL, SportTypeID INTEGER NOT NULL, CONSTRAINT fk_sporttype2 FOREIGN KEY (SportTypeID) REFERENCES SportTypes(SportTypeID)); CREATE TABLE Results( SportsmanID INTEGER NOT NULL, CompetitionID INTEGER NOT NULL, Result INTEGER NOT NULL, CONSTRAINT fk_sportsman FOREIGN KEY (SportsmanID) REFERENCES Sportsmans(SportsmanID), CONSTRAINT fk_competition FOREIGN KEY (CompetitionID) REFERENCES Competitions(CompetitionID), CONSTRAINT pk_results PRIMARY KEY (SportsmanID, CompetitionID)); It is necessary to bring out all athletes (all attributes of an athlete) + the best athlete in his sport + the worst athlete in his sport (the best / worst is considered based on the “middle place” in this sport).
The problem arises in my stage when it is necessary to get various athletes according to the result (better and worst), since I cannot figure out how to make independent columns from one table and how to apply to them later.
The request itself is only this:
select "ID", "sp1First", "sp1Last", "sp1Middle", "sID", min(avgRes) over (partition by SportTypeName) as BestRes from (select sp1.SportsmanID as "ID", sp1.FirstName as "sp1First", sp1.LastName as "sp1Last", sp1.MiddleName as "sp1Middle", sp1.SportTypeID as "sID", SportTypeName, avg(Result) over (partition by sp1.SportsmanID, Competitions.SportTypeID) as avgRes from Sportsmans sp1 inner join Results on sp1.SportsmanID = Results.SportsmanID inner join Competitions on Results.CompetitionID = Competitions.CompetitionID inner join SportTypes on SportTypes.SportTypeID = Competitions.SportTypeID inner join Sportsmans sp2 on sp2.SportsmanID = Results.SportsmanID);
first_value(sp1First) over (partition by SportTypeName order by avgRes)to get the name of the athlete with the lowest average score. And a similar last_value to get the maximum - Mike