Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывести для каждой команды самого молодого игрока, PostgreSQL 
:(
    Опции темы
4epT
Дата 11.11.2011, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Имеется 2 таблицы: team и player.

Team:
id (ключ)
team (название)

Player:
id (ключ)
name (имя)
id_team (номер команды в которой он играет)
birthdate (день рождения)

Запрос должен содержать в себе Имя команды, Имя игрока и дату рождения. Дата рождения должна быть самая маленькая (самый старый) или самая большая (самый молодой).

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

Помоги пожалуйста написать данный запрос ) желательно красивый ... друг помог написать, но уже очень сложно ( и решение просто в лоб ...





p.s. и был бы признателен, если бы кто то смог дать список задач по sql, штук 100 - 150 задач отсортированные по уровню сложности =) начиная с обычных select и заканчивая очень сложными =) Ну или какие нибудь источники по которым моно было бы очень хорошо подготовиться!



PM MAIL   Вверх
Akina
Дата 11.11.2011, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(4epT @  11.11.2011,  01:06 Найти цитируемый пост)
при попытке вывести еще имя игрока ругается ( говорит что по нему нужно делать группировку, а судя по логике запроса группировка должна быть только по команде.

Используйте не просто вывод имени, а агрегатную функцию от него  (First, например - есть его в Вашей СУБД?)...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 11.11.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(4epT @  11.11.2011,  00:06 Найти цитируемый пост)
Запрос должен содержать в себе Имя команды, Имя игрока и дату рождения. Дата рождения должна быть самая маленькая (самый старый) или самая большая (самый молодой).


Код

select team
       ,name
       ,birthdate
from 
  (select team.team
    ,player.name
    ,player.birthdate
    ,row_number() -- или dense_rank, если должны быть выведены все игроки у которых дата рождения одинакова и минимальна
      over (partition by player.id_team 
            order by player.birthdate --desc -- для самого старого
           ) rnk
   from player,team
   where player.id_team = team.id
  )
where rnk = 1


+ поиск по форуму по "бабушкин метод", хотя тут он не нужен
Цитата(4epT @  11.11.2011,  00:06 Найти цитируемый пост)
если бы кто то смог дать список задач по sql, штук 100 - 150 задач отсортированные по уровню сложности =) 


sql-ex.ru


Это сообщение отредактировал(а) Zloxa - 11.11.2011, 15:41


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
4epT
Дата 11.11.2011, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



В том то и дело что не понятно какую агрегатную функцию можно там применить ... для дня рождения используется min или max. 

Насчет first сейчас посмотрю ... 
PM MAIL   Вверх
4epT
Дата 11.11.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



В том то и дело что не понятно какую агрегатную функцию можно там применить ... для дня рождения используется min или max. 

Насчет first сейчас посмотрю ... 
PM MAIL   Вверх
4epT
Дата 11.11.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Zloxa, именно такой способ мой друг мне и подсказал =) Скажи пожалуйста, этот запрос самый "красивый" ? по другому не сделаешь ?

За сайт спасибо, посмотрю =)
PM MAIL   Вверх
Zloxa
Дата 11.11.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(4epT @  11.11.2011,  13:59 Найти цитируемый пост)
 этот запрос самый "красивый" ?

Мне - нравится. 
row_number вроде как описан в SQL2003 и из года в год больше и больше платформ его потдерживают.

Цитата(4epT @  11.11.2011,  13:59 Найти цитируемый пост)
по другому не сделаешь ?

Акина подсказал first, гугл подсказал что в ПГ есть что-то подобное, но, похоже это не встроенный аггрегат, а определяемый пользователем. По кр. мере в списке встроенных аггрегатов я его не углядел. Если это так, испльзовать его можно не всегда и не везде.

В оракле есть конструкция keep 
Ее тоже можно использовать для этих целей
Код

select max(team.team) team
       ,max(player.name) keep (dense rank last order by player.birthdate) name
       ,max(player.birthdate) birthdate
  from player,team
  where player.id_team = team.id
  group by player.team_id

но я не знаю, есть ли подобная плюшка в ПГ и держит ли ее вобще ктонить кроме оракла.

Можно испльзовать скалярный подзапрос
Код

select team.team
       ,(select max(name) 
           from player 
           where player.id_team = s.id_team 
           and player.birthdate = s.max_birthdate
         ) name
        ,s.max_birthdate birthdate
from (
  select player.id_team
       ,max(player.birthdate) max_birthdate
  from player
  group by player.team_id
) s
inner join team on s.id_team = team.id

Такой запрос будет рабоатть на подавляющем большинстве платформ, т.к. опирается на синтаксис стандарта sql98

Можно сделать через join
Код

select
  team.team
  ,player.name
  ,s.max_birthdate birthdate
from ( 
  select player.id_team
      ,max(player.birthdate) max_birthdate
  from player
  group by player.team_id
 ) s
inner join team on s.id_team = team.id
inner join player on player.id_team = s.id_team 
                     and player.birthdate = s.max_birthdate

Этот запрос, тоже опирается на синтаксис sql98, но, в отличии от предыдущих, выведет всех игроков дата рождения которых максимальна. К сожалению, как разрешать такие неоднозначности, в исходной постановке вопроса не указано, а всякий раз спрашивать, уже оскомину набило.

наверное еще как-то можно.

Это сообщение отредактировал(а) Zloxa - 11.11.2011, 15:37


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 11.11.2011, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Zloxa @  11.11.2011,  15:34 Найти цитируемый пост)
еще как-то

Код

select team.team
    ,p1.name
    ,p1.birthdate
   from player p1,team
   where p1.id_team = team.id
      and not exists (select null 
                      from player p2 
                      where p1.player= p2.player
                            and p1.birthdate > p2.birthdate
                      )

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.