Как вставить запись с log_date на основе диапазона дат, под который она попадает - PullRequest
0 голосов
/ 19 июня 2019

У меня есть запись и ассоциированная запись для этой записи.Я хочу вставить его в другую таблицу в зависимости от того, в какой диапазон дат он попадает из третьей таблицы.

Например:

Запись для вставки в таблицу 1:

    Col1 | Col 2 | Col 3 | Log_Date | Table2.ID

Таблица 2:

    ID | ColA | ColB | Start_Date | End_Date |

Если Log_Date находится между Start_Date и End_Date, мы вставляем запись вместе с идентификатором из таблицы 2. Я извлекаю таблицу 2, основываясь на совпадении с Col2 =ColA и Col3 = ColB.

Например (мое объяснение довольно скудное, поэтому я надеюсь, что это проясняет ситуацию):

Таблица 2:

    ID | ColA | ColB | Start_Date | End_Date 

    1  | 123  | 345  | 2018-08-28 | 2018-09-29
    2  | 123  | 345  | 2018-09-29 | NULL

В этомВ этом случае мы примем Col 2 = ColA и Col3 = ColB и получим два идентификатора.Если Log_Date <= End_Date, мне нужен ID = 1, а если Log_Date> End_Date, мне нужен ID = 2.

Чаще всего у меня будет что-то похожее на выше, где я получу совпадение на2 строки в таблице 2, где одна End_Date будет равна NULL.

Любая помощь приветствуется!

PS Эта проверка будет частью оператора вставки, если нет лучшего способа сделать это.?

Редактировать: Для большей ясности, в приведенном выше примере предположим, что это записи:

    Col1 | Col2 | Col3 | Log_Date
    123  | 345  | 456  | 2018-09-01
    123  | 345  | 456  | 2018-09-05
    123  | 345  | 456  | 2018-09-09
    123  | 345  | 456  | 2018-09-15
    123  | 345  | 456  | 2018-10-01
    123  | 345  | 456  | 2018-10-15

Затем я объединяю их с таблицей 2 на Col1 = ColA и Col2 = ColB * 1029.*

Результат:

    Col1 | Col2 | Col3 | Log_Date   | ID |ColA | ColB | Start_Date | End_Date
    123  | 345  | 456  | 2018-09-01 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-01 |  2 | 123 | 345  | 2018-09-29 | NULL
    123  | 345  | 456  | 2018-09-05 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-05 |  2 | 123 | 345  | 2018-09-29 | NULL
    123  | 345  | 456  | 2018-09-09 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-09 |  2 | 123 | 345  | 2018-09-29 | NULL
    123  | 345  | 456  | 2018-09-15 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-15 |  2 | 123 | 345  | 2018-09-29 | NULL
    123  | 345  | 456  | 2018-10-01 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-10-01 |  2 | 123 | 345  | 2018-09-29 | NULL
    123  | 345  | 456  | 2018-10-15 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-10-15 |  2 | 123 | 345  | 2018-09-29 | NULL

Что я хочу вставить из этого:

    Col1 | Col2 | Col3 | Log_Date   | ID |ColA | ColB | Start_Date | End_Date
    123  | 345  | 456  | 2018-09-01 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-05 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-09 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-09-15 |  1 | 123 | 345  | 2018-08-28 | 2018-09-29
    123  | 345  | 456  | 2018-10-01 |  2 | 123 | 345  | 2018-09-29 | NULL
    123  | 345  | 456  | 2018-10-15 |  2 | 123 | 345  | 2018-09-29 | NULL

1 Ответ

0 голосов
/ 20 июня 2019

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

SELECT Col1,Col2,Col3,CONVERT(date,Log_Date) AS Log_Date
INTO dbo.Table1
FROM (VALUES(123,345,456,'20180901'),
            (123,345,456,'20180905'),
            (123,345,456,'20180909'),
            (123,345,456,'20180915'),
            (123,345,456,'20181001'),
            (123,345,456,'20181015'))V(Col1,Col2,Col3,Log_Date);

SELECT ID,ColA,ColB,CONVERT(date,Start_Date) AS Start_Date,CONVERT(date,End_Date) AS End_Date
INTO dbo.Table2
FROM (VALUES(1,123,345,'20180828','20180929'),
            (2,123,345,'20180929',NULL)) V(ID,ColA,ColB,Start_Date,End_Date)
GO

SELECT *
FROM dbo.Table1 T1
     JOIN dbo.Table2 T2 ON T1.Col1 = T2.ColA
                       AND T1.Col2 = T2.ColB
                       AND ((T1.Log_Date <= T2.End_Date AND T2.ID = 1)
                        OR  (T1.Log_Date >= T2.Start_Date AND (T1.Log_Date > T2.End_Date OR T2.End_Date IS NULL) AND T2.ID = 2));


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