Минимальная разница между временными метками с оконной функцией - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть следующие базовые наборы данных.

Я хотел бы знать метку времени ProcessStepLast для каждой записи ProcessStepOne.

  • Последняя запись ProcessStepOne для каждого PersonId должна иметь самую последнюю запись ProcessStepLast для того же PersonId.
  • Следующая последняя запись ProcessStepOne должна иметь следующую последнюю запись ProcessStepLast и так далее.
  • Запись ProcessStepLast может принадлежать только одной записи ProcessStepOne.
  • Всегда будет хотя бы один ProcessStepOne на PersonId.
  • Может быть ноль, одна или несколько записей ProcessStepLastна человека

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

Любая помощь будет высоко ценится.

Id       PersonId    ProcessStepOne
1084465  11802   2019-01-18 15:45:44.000
1084507  11802   2019-01-18 16:07:22.000

Id       PersonId    ProcessStepLast
1016970  11802   2019-01-24 12:51:52.600
1016996  11802   2019-01-24 12:55:21.953
1013472  11802   2019-01-24 12:51:45.803 

Id       PersonId    ProcessStepOne            ProcessStepLast
1084465  11802   2019-01-18 15:45:44.000   2019-01-24 12:51:52.600
1084507  11802   2019-01-18 16:07:22.000   2019-01-24 12:55:21.953

1 Ответ

0 голосов
/ 11 февраля 2019

Ваш ожидаемый результат не полностью соответствует тому, что вы описываете, потому что запись 2019-01-24 12:51:45.803 из второго набора данных нигде не появляется.Но общее решение, которое могло бы сработать, состояло бы в том, чтобы объединить две таблицы, а затем просто объединить их в пары:

WITH cte AS (
    SELECT Id, PersonId, ProcessStepOne AS ProcessStep, 1 AS source,
        ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY ProcessStepOne) rn
    FROM table1
    UNION ALL
    SELECT Id, PersonId, ProcessStepTwo, 2,
        ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY ProcessStepTwo)
    FROM table2
)

SELECT
    MAX(CASE WHEN source = 1 THEN Id END) AS Id,
    PersonId,
    MIN(ProcessStep) AS ProcessStepOne,
    MAX(ProcessStep) AS ProcessStepTwo
FROM cte
GROUP BY
    PersonId,
    rn;

enter image description here

Демонстрация

В качестве примечания, вычисляемый столбец source, который я ввел в запрос CTE объединения, есть, чтобы мы могли запомнить, какое значение Id соответствуетпервый стол.Это должно соответствовать вашему требованию использовать метки Id первого источника в ожидаемом выводе.

...