Запрос на присоединение к диапазону дат - PullRequest
1 голос
/ 08 апреля 2011

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

=========================
Periods
=========================
PeriodID  StartDate   EndDate
1         01-01-11    07-01-11
2         08-01-11    15-01-11

и так далее в течение всего года

=========================
History
=========================
PersonID  From       To
1         01-01-11  05-04-11
2         17-06-11   NULL 
and so on

Я хочу следующий вывод

 StartDate   EndDate   PersonID
  01-01-11    07-01-11    1
  08-01-11    15-01-11    1
  .
  .
  15-04-11   21-04-11     NULL
  .
  .
  15-06-11   21-06-11     2

IМне нужно объединить эти две таблицы, но я не могу понять, как будет выглядеть условие соединения

Ragards

Ответы [ 5 ]

5 голосов
/ 08 апреля 2011
SELECT
  p.StartDate,
  p.EndDate,
  h.PersonID
FROM Periods p
  LEFT JOIN History h
    ON h.[From] BETWEEN p.StartDate AND p.EndDate OR
       p.StartDate BETWEEN h.[From] AND ISNULL(h.[To], '30000101')
1 голос
/ 08 апреля 2011

Это повлияет на производительность, но я думаю, что стоит попробовать нечетный взгляд между:

select x
from table1 t1
  inner join table2 t2
    on t2.date between t1.startdate and t1.enddate

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

1 голос
/ 08 апреля 2011

Вам необходимо выполнить левое объединение, чтобы показать все доступные периоды, даже если с этим периодом нет записей истории.Критерии были бы, если дата истории была между периодом.Вам также необходимо проверить, была ли дата «Дата» нулевой, и включить ее в свои результаты

SELECT  p.StartDate, p.EndDate, h.PersonId
FROM    Period p
        LEFT JOIN History h
            ON p.StartDate >= h.[From] AND 
            (h.[To] IS NULL OR p.EndDate <= h.[To])
1 голос
/ 08 апреля 2011

Можете ли вы попробовать:

SELECT P.StartDate, P.EndDate, H.PersonID
FROM Period P INNER JOIN History H ON P.StartDate <= H.Fromand (P.EndDate >= H.To OR H.To IS NULL)

Я отредактировал SQL после более четкого прочтения спецификации

Я снова отредактировал SQL.Я сейчас использую INNER JOIN.

0 голосов
/ 11 марта 2015

в таблице 'history', установите NULL в '9999-12-31'

выбор * из периодов внутренней истории соединения b на a.from b.from

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