我试图从数据库中提取数据中的数据。我无法解决错误(这是一个“设计功能”),所以我必须尝试查询它。这是它的存储方式。
Record ID | Create Date | Update Date | Record Status
123 | 05/01/2018 | 05/01/2018 | Active
123 | 05/08/2018 | 05/08/2018 | Active
123 | 05/15/2018 | 05/15/2018 | Closed
123 | 05/22/2018 | 05/22/2018 | Closed
456 | 06/02/2018 | 06/02/2018 | Pending
456 | 06/09/2018 | 06/09/2018 | Active
456 | 06/16/2018 | 06/16/2018 | Active
456 | 06/23/2018 | 06/23/2018 | Suspended
等等。如您所见,每行的“创建日期”和“更新日期”值都匹配。创建日期值应该是最初创建记录ID的日期,但它实际上被捕获为创建记录ID更新的日期。
我需要的是一个报告,它为每个记录ID提供一行,向我显示最小的创建日期和最大更新日期,以便结果如下所示:
Record ID | Create Date | Update Date | Record Status
123 | 05/01/2018 | 05/22/2018 | Closed
456 | 06/02/2018 | 06/23/2018 | Suspended
我已经尝试在查询设计器中使用MIN和MAX聚合函数,并且可以正常工作,直到我添加可能在记录的生命周期中更改的任何其他字段。我明白了:
Record ID | Create Date | Update Date | Record Status
123 | 05/01/2018 | 05/08/2018 | Active
123 | 05/15/2018 | 05/22/2018 | Closed
456 | 06/02/2018 | 06/02/2018 | Pending
456 | 06/09/2018 | 06/16/2018 | Active
456 | 06/23/2018 | 06/23/2018 | Suspended
我对Report Builder比较陌生,不过我觉得我很快就会接受它的概念。我在这里错过了什么?
编辑添加,当我使用查询设计器时,查询文本如下所示:
SELECT
DB.RECORD.RECORD_ID
,DB.RECORD.RECORD_STATUS_CODE
,MAX(DB.RECORD.RECORD_CREATED_DATE) AS Max_RECORD_CREATED_DATE
,MIN(DB.RECORD.RECORD_UPDATED_DATE) AS Min_RECORD_UPDATED_DATE
FROM
DB.RECORD
GROUP BY
DB.RECORD.RECORD_ID
,DB.RECORD.RECORD_STATUS_CODE
使用CTE有更优雅的方法,但这是一个简单的解决方案。
首先,我将您的数据样本复制并填入表变量@t
。然后我们所做的就是按记录组分组,获取最小创建日期和最大更新日期(暂时忽略状态)。我们加入这个子查询回到你的原始表,加入记录和更新日期,这将给我们记录id的最后一条记录,并从那里获得状态。
DECLARE @t TABLE ([Record ID] int, [Create Date] date, [Update Date] date, [Record Status] varchar(20))
INSERT INTO @t VALUES
(123, '2018-05-01', '2018-05-01', 'Active'),
(123, '2018-05-08', '2018-05-08', 'Active'),
(123, '2018-05-15', '2018-05-15', 'Closed'),
(123, '2018-05-22', '2018-05-22', 'Closed'),
(456, '2018-06-02', '2018-06-02', 'Pending'),
(456, '2018-06-09', '2018-06-09', 'Active'),
(456, '2018-06-16', '2018-06-16', 'Active'),
(456, '2018-06-23', '2018-06-23', 'Suspended')
SELECT
g.[Record ID], g.[Create Date], g.[Update Date], t.[Record Status]
FROM
(
SELECT [Record ID], MIN([Create Date]) AS [Create Date], MAX([Update Date]) AS [Update Date]
FROM @t
GROUP BY [Record ID]
) g
JOIN @t t ON g.[Record ID] = t.[Record ID] and g.[Update Date] = t.[Update Date]
ORDER BY [Record ID]
这是指向显示结果的SQL小提琴的链接。与此版本的唯一区别是表名。
http://sqlfiddle.com/#!18/0bb22/1/0
更新基于您的数据集查询
这可能不是100%,因为我没有;要测试所有数据,但您可能只需要以下内容。
SELECT
g.RECORD_ID, g.RECORD_CREATED_DATE, g.lastUpdateDate, t.RECORD_STATUS_CODE
FROM
(
SELECT RECORD_ID, MIN(RECORD_CREATED_DATE) AS RECORD_CREATED_DATE, MAX(RECORD_UPDATED_DATE) AS lastUpdateDate
FROM DB.RECORD
GROUP BY RECORD_ID
) g
JOIN DB.RECORD t ON g.RECORD_ID = t.RECORD_ID and g.lastUpdateDate = t.RECORD_UPDATED_DATE
ORDER BY RECORD_ID