SQL-соединение между проблемами подсчета дат - PullRequest
1 голос
/ 22 мая 2019

Трудный вопрос, чтобы объяснить, поэтому, пожалуйста, потерпите меня.

У меня есть две таблицы:

1) Разбивка по Дате и указанию того, были ли они в Базовом дне в тот день (Д / Н)

ID      Date        Basic_Days
5423    2019-02-03  1
5423    2019-02-04  0
5423    2019-02-05  1
5423    2019-02-06  1
5423    2019-02-07  1
5423    2019-02-08  1
5423    2019-02-09  0
5423    2019-02-10  0
5423    2019-02-11  0
5423    2019-02-12  0
5423    2019-02-13  0
5423    2019-02-14  1
5423    2019-02-15  1
5423    2019-02-16  1

2) Разбивка периодов с разными датами по заказам

EPI_Start_Date  EPI_End_Date     ID     EPI_ORDER
2019-02-03      2019-02-04       5423   1
2019-02-04      2019-02-15       5423   2
2019-02-15      2019-02-16       5423   3

То, что я пытаюсь сделать, - это присвоить отдельные дни их соответствующим EPI_ORDER, но без двойного счета дней.

Идеальный результат:

Basic_Days  EPI_Start_Date  EPI_End_Date    ID      EPIORDER
1           2019-02-03      2019-02-04      5423    1
5           2019-02-04      2019-02-15      5423    2
2           2019-02-15      2019-02-16      5423    3

Что я пробовал до сих пор:

Запрос, который я начал, почти возвращает меня туда. Но я бы хотел, чтобы правильно обрабатывать последнее свидание.

SELECT 
 SUM(CAST(p.Basic_Days AS int)) AS Basic_Days
, x.EPI_Start_Date
, x.EPI_End_Date
, p.ID
, x.EPIORDER


FROM *SNIP* AS x

    INNER JOIN *SNIP* table leapfrog join here, unnecessary for display purposes AS cc

    INNER JOIN *SNIP* AS p 
    ON  p.ID = cc.ID

    AND (   (p.[Date] BETWEEN x.EPI_Start_Date AND x.EPI_End_Date) 

        AND (p.[Date] <> x.EPI_End_Date) ) --this was my effort into not counting the last day on each, but it doesn't work for the very final day, where I DO want it.


WHERE p.ID = '5423' --testing

GROUP BY  EPI_Start_Date
        , EPI_End_Date
        , x.EPIORDER
        , ID

Мой фактический вывод дает мне:

Basic_Days  EPI_Start_Date  EPI_End_Date    ID      EPIORDER
1           2019-02-03      2019-02-04      5423    1
5           2019-02-04      2019-02-15      5423    2
1           2019-02-15      2019-02-16      5423    3

Вы видите, что последняя строка имеет только 1 Basic_Days. Но я бы хотел, чтобы это было 2 Basic_Days.

Я чувствую, что я не слишком далеко, но мне просто нужно настроить операторы AND в моем Join.

Любая помощь приветствуется! Надеюсь, я объяснил достаточно хорошо, чтобы понять?

1 Ответ

0 голосов
/ 22 мая 2019

Измените свой МЕЖДУ на

p.[Date] >= x.EPI_Start_Date AND  p.[Date] < x.EPI_End_Date

МЕЖДУ включительно на обоих концах, то есть он ведет себя так, что удвоит количество ваших дней:

--don't want the end date compare to be <=
p.[Date] >= x.EPI_Start_Date AND  p.[Date] <= x.EPI_End_Date

Вы можетеудалить (p.[Date] <> x.EPI_End_Date) тоже

Наконец, я хотел бы отметить, что ваш идеальный вывод несовместим - для большинства ваших идеальных выводов вы сказали, что не хотите, чтобы записи падали на дату окончаниябыть включенным в эту группу, а затем внезапно для последней записи, вы действительно хотите, чтобы это было в группе.Можно создать запрос, который позаботится об этом, но это противоречивое моделирование данных, чтобы иметь 2 строки, которые не содержат значения в своем диапазоне, а затем одну строку, которая внезапно включает значение, которое не будет включать другая строка "просто потому, что для этого нет другой группы "- решите, действительно ли это то, что вам нужно, потому что в следующий раз, когда вы запустите этот отчет," число основных дней между 15 и 16-м "уменьшится с 2 до 1, просто потому, что другойдобавлена ​​полоса (например, с 16 до 21) ..

Что-то вроде этого будет случайным образом включать последнюю строку в неправильную полосу "только потому, что это последняя строка":

INNER JOIN (SELECT t.*, MAX(EPI_END_DATE) OVER(PARTITION BY ID) as max_end_date FROM date_ranges_table) x
ON 
  p.ID = x.ID AND
  p.[Date] >= x.EPI_Start_Date AND (p.[Date] < x.EPI_End_Date OR p.Date = x.max_end_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...