Максимальное значение SQL для указанного предела - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь вернуть список лет, когда выполняются определенные условия, но у меня возникают проблемы с функцией MAX, и она работает с остальной частью моей логики.

Для следующих двух таблиц:

          coach
coach | team | wins | year
------+------+------+------
nk01  | a    | 4    | 2000
vx92  | b    | 1    | 2000
nk01  | b    | 5    | 2003
vx92  | a    | 2    | 2003

           team
team | worldcupwin | year
-----+-------------+------
a    | Y           | 2000
b    | N           | 2000
a    | Y           | 2003
b    | N           | 2003

Я хочу получить следующий результат:

years
-----
2000

Где напечатаны годы, когда команда тренеров с большинством побед в этом году также выиграла кубок мира.

Я решил использовать функцию MAX, но быстро столкнулся с проблемой незнания, как использовать ее, чтобы искать максимальные значения только для определенного года.Вот что я получил до сих пор:

SELECT y.year
FROM (SELECT c.year, MAX(c.wins), c.team
      FROM coach AS c
      WHERE c.year >= 1999
      GROUP BY c.year, c.team) AS y, teams AS t
WHERE y.year = t.year AND t.worldcupwin = 'Y' AND y.team = t.team;

Этот запрос выводит для меня все годы, больше чем 1999, а не только те, где тренер с наибольшим количеством побед также выиграл кубок мира.(Используя postgresql)

Любая помощь приветствуется!

Ответы [ 4 ]

0 голосов
/ 04 марта 2019

Вы можете использовать ниже, чтобы получить желаемый результат:

ЛЕГКИЙ МЕТОД

SELECT TOP 1 c.year 

FROM coach AS c INNER JOIN team AS t ON c.team = t.team AND c.year = t.year

WHERE t.worldcupwin = 'Y'

ORDER BY c.wins DESC;
0 голосов
/ 04 марта 2019

Вы можете использовать коррелированный подзапрос

DEMO

   SELECT c.year, c.team
      FROM coachs AS c inner join teams t on c.team = t.team and c.year=t.year
      WHERE c.year >= 1999 and exists (select 1 from coachs c1 where c.team=c1.team 
      having max(c1.wins)=c.wins) 

и t.worldcupwin = 'Y'

ВЫХОД:

year    team
2000    a 
0 голосов
/ 04 марта 2019

В следующем запросе используется DISTINCT ON:

SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
FROM coach AS c
INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
WHERE c.year > 1999 
ORDER BY year, wins DESC

, чтобы вернуть записи с наибольшим числом побед в год

year    wins    worldcupwin team
---------------------------------
2000    4       Y           a
2003    5       N           b

Фильтрация команд, которые невыиграть кубок мира:

SELECT year, team
FROM (
   SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
   FROM coach AS c
   INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
   WHERE c.year > 1999 
   ORDER BY year, wins DESC) AS t
WHERE t.worldcupwin = 'Y'       
ORDER BY year, wins DESC

дает ожидаемый результат:

year    team
-------------
2000    a

Демо здесь

0 голосов
/ 04 марта 2019

использование row_number() оконная функция

select a.coach,a.team,a.win,a.year from 

 (select c.*,t.*,
row_number()over(order by wins desc) rn 
from  coach c join team t on c.team=t.team
 where worldcupwin='Y'
 ) a where a.rn=1
...