我正在尝试从具有错误的数据库中提取数据。我无法解决错误(这是一个"设计功能"),因此我必须尝试围绕它查询。这是存储的方式。
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
我已经尝试在查询设计器中使用最小和最大聚合功能,这效果很好,直到我添加可能在记录寿命中变化的其他字段为止。我明白了:
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
我相对较新,以报告建筑商,尽管我认为我很快就拿起了它的概念。我在这里缺少什么?
编辑为补充说,当我使用查询设计师时,查询文本如下所示:
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
中。然后,我们要做的就是通过recordID进行组,获取最小创建日期和最大更新日期(暂时忽略状态)。我们加入此子查询回到您的原始表,加入RecordID和更新日期,这将为我们提供记录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/0BB2222222/0
update 基于数据集查询
这可能不是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