Если ваша версия Informix достаточно свежая, вы можете попробовать использовать следующее, используя выражения окна OLAP.
-- The setup
CREATE TABLE ntcenh
(
nenh_entity CHAR(10)
, nenh_trans_date INTEGER
, nenh_trans_time INTEGER
, nenh_new_status_6 CHAR(10)
);
INSERT INTO ntcenh VALUES ('EDNSB002', 20180808, 201230, 'SCHED DT');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 104731, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 101747, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 83237, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 80252, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 62250, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 55311, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 54329, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 51354, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 44208, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 42728, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 40551, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 35112, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 31912, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 31138, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 23411, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 21546, 'STANDBY');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 13707, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 11322, 'PRODUCTIVE');
INSERT INTO ntcenh VALUES ('EDNSB002', 20180723, 5414, 'PRODUCTIVE');
И запрос:
SELECT DISTINCT
vt2.nenh_new_status_6
, MIN(vt2.nenh_datetime)
OVER(PARTITION BY vt2.status_group) AS min_nenh_datetime
, MAX(vt2.nenh_datetime)
OVER(PARTITION BY vt2.status_group) AS max_nenh_datetime
FROM
(
SELECT
vt1.nenh_new_status_6
, vt1.nenh_datetime
, SUM(vt1.changed) OVER (ORDER BY vt1.nenh_datetime DESC) AS status_group
FROM
(
SELECT
nenh_new_status_6
, nenh_trans_date * 10000000 + nenh_trans_time AS nenh_datetime
, DECODE(LAG(nenh_new_status_6) OVER (ORDER BY nenh_trans_date * 10000000 + nenh_trans_time DESC)
, nenh_new_status_6, 0
, 1) AS changed
FROM
ntcenh
ORDER BY
nenh_datetime DESC
) AS vt1
ORDER BY
vt1.nenh_datetime DESC
) AS vt2
ORDER BY
min_nenh_datetime DESC;
Результаты:
nenh_new_status_6 min_nenh_datetime max_nenh_datetime
SCHED DT 201808080201230 201808080201230
STANDBY 201807230051354 201807230104731
PRODUCTIVE 201807230031912 201807230044208
STANDBY 201807230021546 201807230031138
PRODUCTIVE 201807230005414 201807230013707
В виртуальной таблице vt1
Я использую функцию LAG
для сравнения nenh_new_status_6
с предыдущей строкой, упорядоченной по вычисленному времени.Если они равны, я присваиваю ноль столбцу changed
, в противном случае я присваиваю 1. В виртуальной таблице vt2
я вычисляю совокупную сумму столбца changed
, поэтому у меня есть разные значения для каждого диапазона nenh_new_status_6
встолбец status_group
.Наконец, я вычисляю MIN
и MAX
значения nenh_datetime
для каждого status_group
.
Возможно, я слишком усложнил решение, но, похоже, оно дает желаемые результаты.