Есть много способов сделать это, на ум приходят функции окон
Что-то вроде
SELECT max(date)
FROM (
SELECT status, date, lag(status) OVER window1, last_value(status) OVER window1 last_status
FROM historical
WHERE objectid = 12
WINDOW window1 AS ( ORDER BY date)
) x
WHERE (status <> lag OR lag IS NULL)
AND status = last_status;
Примечания:
- с использованием ключевых слов в качестве имен полей (таких как задержка и дата) следует избегать
- есть много других способов написать этот запрос
- в настоящее время он работает для одного объекта (
objectid = 12
), но его можно изменить, чтобы он возвращалдата последнего статуса для каждого объекта
РЕДАКТИРОВАТЬ
Тестовые данные
CREATE TABLE historical (
id integer,
objectid integer,
date date,
status integer
);
INSERT INTO historical VALUES (1, 12, '2000-01-01', 2);
INSERT INTO historical VALUES (2, 12, '2001-01-01', 2);
INSERT INTO historical VALUES (3, 12, '2002-01-01', 6);
INSERT INTO historical VALUES (4, 12, '2003-01-01', 6);
INSERT INTO historical VALUES (5, 12, '2004-01-01', 1);
INSERT INTO historical VALUES (6, 12, '2005-01-01', 1);
INSERT INTO historical VALUES (7, 12, '2006-01-01', 2);
INSERT INTO historical VALUES (8, 12, '2007-01-01', 2);
INSERT INTO historical VALUES (9, 12, '2008-01-01', 2);
В будущем вы можете захотеть опубликовать результаты вашего
pg_dump -t table_name --inserts
, поэтому проще настроить тестовый набор