Как добавить (не сгруппированный) столбец в сгруппированную таблицу? - PullRequest
0 голосов
/ 21 сентября 2018

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

Упражнение:

Для каждой страны найдите год, в котором было максимальное количество кораблей.запущен.Если речь идет о более чем одном году, возьмите минимальный год.

У меня есть две таблицы, которые связаны внешним ключом "класс" (см. Ниже):

КЛАССЫ

enter image description here

КОРАБЛИ

enter image description here

Мне нужен следующий результат:

(maxNumber = количество лет (столбец: "запущен") для каждой страны)

enter image description here

У меня естьследующий запрос, который дает мне - почти - правильный результат:

SELECT e.country, MAX(e.number) as maxNumber
FROM(
    SELECT d.country, d.Year, count(*) as number
    FROM(
        SELECT a.country, b.launched AS Year
        FROM Classes a 
        INNER JOIN ships b ON a.class=b.class
        ) d
GROUP BY d.country, d.Year) e
GROUP BY e.country

РЕЗУЛЬТАТ:

enter image description here

Моя проблема: Как мнеполучить столбец «ГОД» в таблице, не добавляя его в GROUP-функцию?Если я просто добавлю «год» в GROUP-функцию, Maxnumber будет разделен на Years.Все, что мне нужно, это добавить соответствующий год в каждую строку таблицы (как показано в требуемом результате).

Надеюсь, вам, мастерам SQL, поможет решить эту проблему.

спасибо.Br, Jakob

1 Ответ

0 голосов
/ 21 сентября 2018

Эта часть немного избыточна:

SELECT d.country, d.Year, count(*) as number
FROM(
     SELECT a.country, b.launched AS Year
     FROM Classes a 
     INNER JOIN ships b ON a.class=b.class
     ) d
GROUP BY d.country, d.Year

Вы можете просто сделать это:

SELECT a.country, b.launched AS Year, count(*) as Number
FROM Classes a 
INNER JOIN ships b ON a.class=b.class
GROUP BY a.country, b.launched

Затем вы можете использовать ROW_NUMBER, чтобы назначить строку с наибольшим числом встрана a 1:

SELECT a.country, b.launched AS Year, count(*) as Number,
       ROW_NUMBER() over (PARTITION BY a.country ORDER BY COUNT(*) DESC) as RN
FROM Classes a 
INNER JOIN ships b ON a.class=b.class
GROUP BY a.country, b.launched

Затем просто сделайте внешний выбор, чтобы получить строки, где RN = 1:

SELECT country, year, number
FROM (SELECT a.country, b.launched AS Year, count(*) as Number,
             ROW_NUMBER() over (PARTITION BY a.country ORDER BY COUNT(*) DESC) as RN
      FROM Classes a 
      INNER JOIN ships b ON a.class=b.class
      GROUP BY a.country, b.launched
     ) A
WHERE RN = 1
...