SQL Подзапрос для каждого - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть следующие таблицы

create table players
(
    name varchar(30) not null primary key,
);

create table injuries

    bId int not null primarykey,
    date DATE not null,
    name varchar(30), 
    foreign key(name) references players
);

create table sportsBegins
(
    cId int not null primarykey,
    date DATE,
    sportname varchar(20),
    name varchar(30) 
    foreign key(name) references players
);

Данные следующего примера:

игроков

name
John    
Jane 
George 

shows players in db

sportsBegins

cId |    date   | sportname | name
1    2020-01-01   Basketball  John
2    2020-02-02   Basketball  John
3    2020-01-01   Soccer      John
4    2020-02-02   Basketball  Jane
5    2020-01-03   Basketball  George
6    2020-01-04   Badminton   George

shows what date players begin playing a sport

травмы

bId |    date   | name    
1    2020-01-01   John     
2    2020-02-03   Jane     
3    2020-01-05   George

shows the date these players reported injuries.

Я хочу посчитать количество ДИСТИНКТ игроков, которые получили травму в баскетболе ПОСЛЕ первого дня, когда они получили вид спорта ( не в тот же день).

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

Пример

В приведенных мной примерах данных это будет вывод

Total basketball injuries
2

Объяснение ответа

Джон дважды получил баскетбол. Только посмотрите на первое свидание, он получил назначенный баскетбол. Тогда посмотрите на таблицу травм. Он только сообщил о травме в тот день, но не после, так что игнорируйте. Джейн и Джордж сообщили о травмах после первого назначенного баскетбольного матча, поэтому посчитайте их

1 Ответ

0 голосов
/ 20 апреля 2020

Это должно дать вам желаемый результат

SELECT count(distinct injuries.name)
FROM injuries
INNER JOIN (SELECT name, min(date) as startDate FROM sportsBegins WHERE sportname = 'Basketball' GROUP BY name) as startDates ON injuries.name=startDates.name and injuries.date > startDates.startDate

Краткое объяснение:

  • startDates извлекает первую дату, когда каждый игрок начал играть в баскетбол
  • условие соединения • фильтрует только травмы, которые произошли после первой даты старта для каждого игрока
  • count (Different injuries.name), гарантирует, что каждый игрок будет засчитан только один раз, даже если он / она сообщил о более чем одной травме после первой даты старта
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...