Продолжительность SQL между датами для разных людей

Надеюсь, кто-то может помочь мне с следующей задачей: я получил 2 таблицы Лечение и "Человек". Treatment содержит даты начала лечения для разных лиц, Персона содержит личную информацию, например, фамилию.

Теперь мне нужно найти всех людей, у которых продолжительность между первым и последним лечением превышает 20 лет. Таблицы выглядят примерно так:

Person
| PK_Person | First name | Name |
_________________________________
| 1 | A_Test | Karl |
| 2 | B_Test | Marie |
| 3 | C_Test | Steve |
| 4 | D_Test | Jack |

Treatment
| PK_Treatment | Description | Starting time | PK_Person |
_________________________________________________________
| 1 | A | 01.01.1989 | 1
| 2 | B | 02.11.2001 | 1
| 3 | A | 05.01.2004 | 1
| 4 | C | 01.09.2013 | 1
| 5 | B | 01.01.1999 | 2

Так что в этом примере на выходе должно быть лицо Karl, A_Test.

Надеюсь, понятно, в чем проблема, и кто-то может мне помочь.

Изменить: Кажется, есть проблема с форматированием, таблицы не отображаются правильно, я надеюсь, что он читается.

3 ответа

SELECT *
FROM person p
INNER JOIN Treatment t on t.PK_Person = p.PK_Person 
WHERE DATEDIFF(year,[TREATMENT_DATE_1], [TREATMENT_DATE_2]) > 20

Это должно сделать это, однако это не проверено, поэтому нужно будет настроить вашу схему

Ваши данные выглядят немного подозрительно, потому что имя не похоже на имя.

Но то, что вы хотите сделать, это объединить Treatment таблица для каждого человека и получить минимальное и максимальное время начала. Если разница превышает 20 лет, оставьте человека и присоединитесь к таблице людей, чтобы получить имена.

select p.FirstName, p.LastName
from Person p join
     (select pk_person, MIN(StartingTime) as minst, MAX(StartingTime) as maxst
      from Treatment t
      group by pk_person
      having MAX(StartingTime) - MIN(StartingTime) > 20*365.25
     ) t
     on p.pk_person = t.pk_person;

Обратите внимание, что арифметика даты зависит от базы данных. В большинстве баз данных, принимая разницу двух дат, подсчитывается количество дней между ними, так что это довольно общий подход (хотя не гарантируется работа на всех базах данных).

Я выбрал немного другой подход и работал с SQL Fiddle, чтобы убедиться, что нижеприведенные операторы работают.

Как упоминалось ранее, данные кажутся немного подозрительными; тем не менее, согласно вашим требованиям, вы сможете сделать следующее:

select P.PK_Person, p.FirstName, p.Name
from person P
  inner join treatment T on T.pk_person = P.pk_person
where DATEDIFF((select x.startingtime from treatment x where x.pk_person = p.pk_person order by startingtime desc limit 1), T.StartingTime) > 7305

Во-первых, нам нужно присоединиться к внутренним процедурам, которые будут игнорировать людей, которых нет в таблице лечения. Часть где теперь просто нужно выбрать на основе ваших критериев (в данном случае разница дат). При выполнении подзапроса будет сгенерирована последняя дата обращения человека, сравните это с каждой из ваших записей и отфильтруйте по количеству дней (7305 = 20 лет * 365,25).

Вот рабочий пример SQL Fiddle.

Другие вопросы по тегам