Oracle SQL - как НЕ ПОКАЗАТЬ имя спортсмена, которое встречается только один раз - PullRequest
0 голосов
/ 18 июня 2020

создал представление, называемое победителями, оно содержит столбцы: athlete_name, year, medal_won его основных спортсменов, которые выиграли олимпийские медали c медаль и год, это выглядит так,

база данных находится в режиме реального времени sql: https://livesql.oracle.com/apex/f?p=590: 1000: 0

select distinct year,athlete_name,medal
from olym.olym_medals
join olym.olym_athlete_games on olym_athlete_games.id = olym_medals.athlete_game_id
join olym.olym_nations on olym_nations.id = olym_athlete_games.nation_id
join olym.olym_games on olym_games.id = Olym_athlete_games.game_id 
join olym.olym_athletes on olym_athletes.id = olym_athlete_games.athlete_id
order by  athlete_name

, так как вы можете видеть, что некоторые имена отображаются только один раз, а некоторые имена отображаются более одного раза, я хочу избавиться от всех строчки тех, кто показывает ТОЛЬКО ОДИН РАЗ, помогите пожалуйста. спасибо!

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Если я правильно следил за вами, вы можете использовать оконные функции:

select *
from (
    select og.year, oa.athlete_name, om.medal, count(*) over(partition by oa.id) cnt
    from olym.olym_medals om
    join olym.olym_athlete_games oag on oag.id = om.athlete_game_id
    join olym.olym_nations ona       on ona.id = oag.nation_id
    join olym.olym_games og          on og.id = oag.game_id 
    join olym.olym_athletes oa on    oa.id = oag.athlete_id
) t
where cnt > 1
order by  athlete_name

Примечания:

  • Я не уверен, почему вы использовали distinct в первое место, поэтому я удалил его (подозреваю, что он на самом деле не нужен)

  • Я добавил псевдонимы таблиц, чтобы сократить запрос, и добавил к столбцам в предложении select таблицу они принадлежат (вы, возможно, захотите это проверить) - это лучшие практики при работе с многотабличными запросами

0 голосов
/ 18 июня 2020

Используйте GROUP BY и HAVING COUNT(*) > 1:

SELECT year,
       athlete_name,
       medal
FROM   olym.olym_medals
       INNER JOIN olym.olym_athlete_games
       ON olym_athlete_games.id = olym_medals.athlete_game_id
       INNER JOIN olym.olym_nations
       ON olym_nations.id = olym_athlete_games.nation_id
       INNER JOIN olym.olym_games
       ON olym_games.id = Olym_athlete_games.game_id 
       INNER JOIN olym.olym_athletes
       ON olym_athletes.id = olym_athlete_games.athlete_id
GROUP BY
       year,
       athlete_name,
       medal
HAVING COUNT(*) > 1
ORDER BY  athlete_name
0 голосов
/ 18 июня 2020

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

  select year,athlete_name,medal, count(*) "number of Medals" 
  from olym.olym_medals
  join olym.olym_athlete_games on olym_athlete_games.id = olym_medals.athlete_game_id
 join olym.olym_nations on olym_nations.id = olym_athlete_games.nation_id
 join olym.olym_games on olym_games.id = Olym_athlete_games.game_id 
 join olym.olym_athletes on olym_athletes.id = olym_athlete_games.athlete_id
 group by year,athlete_name,medal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...