我正在尝试从其中有错误的数据库中提取数据。我无法解决错误(这是“设计功能”),因此我不得不尝试对其进行查询。存储方式如下。
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
答案 0 :(得分:0)
使用CTE进行此操作的方法更为优雅,但这是一个简单的解决方案。
首先,我复制了您的数据样本并将其填充到表变量using(var reader = new StreamReader(fileName) )
{
reader.BaseStream.Seek(0, SeekOrigin.End);
// You can wait here for other processes to write into this file and then the ReadLine will provide you with that content
var myNextLine = reader.ReadLine();
// TODO: process the line
}
中。然后,我们所做的就是按recordid分组,获取最小创建日期和最大更新日期(暂时忽略状态)。我们将这个子查询加入到您的原始表中,加入recordid和更新日期,这将为我们提供记录id的最后一条记录,并从那里获取状态。
@t
这里是显示结果的SQL Fiddle的链接。此版本的唯一区别是表名称。
http://sqlfiddle.com/#!18/0bb22/1/0
更新基于您的数据集查询
这可能不是100%,因为我没有要测试的所有数据,但您可能只需要以下内容。
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]