SSRS (построитель отчетов) минимальное и максимальное значения из одного набора данных - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь извлечь данные из базы данных, в которой есть ошибка. Я не могу устранить ошибку (это «конструктивная особенность»), поэтому я должен попытаться ее обойти. Вот как это хранится.

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

И так далее. Как видите, значения «Дата создания» и «Дата обновления» совпадают в каждой строке. Предполагается, что значением параметра «Дата создания» будет дата, когда изначально был создан идентификатор записи, но фактически она фиксируется как дата создания обновления идентификатора записи.

Мне нужен отчет, в котором содержится одна строка для каждого идентификатора записи, показывающая минимальную дату создания и максимальную дату обновления, чтобы результат выглядел примерно так:

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 в Query Designer, и это прекрасно работает, пока я не добавлю любое другое поле, которое может измениться в течение жизни записи. Я получаю это:

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

1 Ответ

0 голосов
/ 21 марта 2019

Существуют более элегантные способы сделать это с помощью CTE, но это простое решение.

Сначала я скопировал ваш образец данных и вставил в табличную переменную @t. Затем все, что мы делаем, это группируем по recordid, получая минимальную дату создания и максимальную дату обновления (игнорируя статус на данный момент). Мы присоединяемся к этому подзапросу и возвращаемся к вашей исходной таблице, объединяя запись и дату обновления, это даст нам последнюю запись для идентификатора записи и оттуда получит статус.

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
...