来自同一数据集的SSR(报告构建器)最小值和最大值



我正在尝试从具有错误的数据库中提取数据。我无法解决错误(这是一个"设计功能"),因此我必须尝试围绕它查询。这是存储的方式。

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

最新更新