用窗口函数时间戳之间的最小差

问题描述 投票:0回答:1

我有以下的基本数据集。

我想知道每个ProcessStepOne记录ProcessStepLast时间戳。

  • 每个PERSONID最新ProcessStepOne记录应该有相同的PERSONID最新ProcessStepLast记录。
  • 接下来的最新ProcessStepOne记录应具有下一最新ProcessStepLast记录等。
  • 一个ProcessStepLast记录只能属于一个ProcessStepOne记录。
  • 总是会有每PERSONID至少一个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
sql-server-2014 window-functions
1个回答
0
投票

你期望的输出似乎不与你的描述完全排队,因为从第二个数据集的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

Demo

作为一个侧面说明,计算列source我在联合查询CTE大家介绍的是有那么我们能记住这Id值对应于第一个表。这是为了满足您的期望输出使用第一源Id标签的要求。

© www.soinside.com 2019 - 2024. All rights reserved.