У меня есть следующая таблица:
ID Rating Rating_from Rating_to
1 2 2010-01-01 2011-01-01
1 2 2011-01-02 2012-02-01
1 3 2012-02-02 2013-03-01
1 2 2013-03-02 2013-04-01
1 2 2013-04-02 9999-12-31
Содержит рейтинг по идентификатору, который проверяется на разовой основе. Каждый раз, когда проверяется рейтинг, последней строке присваивается дата Rating_to
, обычно за день до нового рейтинга, и вводится новая строка с датой Rating_from
фактического дня рейтинга. Rating_to
установлен на 9999-12-31
вместо NULL
. ?♀️ Часто рейтинг остается прежним. Время от времени рейтинг меняется. Идентификатор может также со временем получить рейтинг, который он имел раньше.
Как получить самую раннюю дату Rating_from
и самую позднюю дату Rating_to
, по идентификатору, по рейтингу, без группировки оценок, которые имеютто же значение рейтинга, но перемежаются с другими рейтингами?
Я пытаюсь получить следующую таблицу:
ID Rating Rating_from Rating_to
1 2 2010-01-01 2012-02-01
1 3 2012-02-02 2013-03-01
1 2 2013-03-02 NULL
Используя данные сверху, я попытался сгруппировать по ID
иRating
(и установка MIN()
и MAX()
в полях from и to), но тогда я получу только две строки, одну для рейтинга 2 и одну для рейтинга 3, хотя было два периода рейтинга 2.
Я спросил коллегу, он предложил использовать LAG()
и LEAD()
, но я не уверен, как это поможет здесь. Данные хранятся в SQL Server 2017, и их число составляет около миллиона. Любые предложения приветствуются.
Я добавил нижеприведенный скрипт TABLE CREATE
с реальными данными таблиц, надеюсь, это поможет:
CREATE TABLE tbl(
id INT,
rating int,
rating_from DATE,
rating_to DATE
);
INSERT INTO tbl VALUES
(1, 2, '2014-05-23', '2015-04-13'),
(1, 2, '2015-04-14', '2015-06-02'),
(1, 2, '2015-06-03', '2016-05-31'),
(1, 2, '2016-06-01', '2018-03-22'),
(2, 1, '2016-06-01', '9999-12-31'),
(3, 3, '2016-06-01', '9999-12-31'),
(1, 2, '2018-03-23', '2018-08-06'),
(1, 3, '2018-08-07', '2018-08-21'),
(1, 2, '2018-08-22', '2018-09-19'),
(1, 2, '2018-09-20', '9999-12-31');