SQL мин / макс дата из таблицы истории по статусу группировки - PullRequest
0 голосов
/ 10 декабря 2018

Этот запрос отображает данные, с которыми я хочу работать:

SELECT
   nenh_entity
  ,nenh_trans_date
  ,nenh_trans_time
  ,nenh_trans_date*10000000+nenh_trans_time
  ,nenh_new_status_6
FROM
  ntcenh
;
nenh_entity   nenh_trans_date  nenh_trans_time  (expression)           nenh_new_status_6
------------------------------------------------------------------------------------------
EDNSB002      20180808         201230           201808080201230        SCHED DT           
EDNSB002      20180723         104731           201807230104731        STANDBY            
EDNSB002      20180723         101747           201807230101747        STANDBY            
EDNSB002      20180723         83237            201807230083237        STANDBY            
EDNSB002      20180723         80252            201807230080252        STANDBY            
EDNSB002      20180723         62250            201807230062250        STANDBY            
EDNSB002      20180723         55311            201807230055311        STANDBY            
EDNSB002      20180723         54329            201807230054329        STANDBY            
EDNSB002      20180723         51354            201807230051354        STANDBY            
EDNSB002      20180723         44208            201807230044208        PRODUCTIVE         
EDNSB002      20180723         42728            201807230042728        PRODUCTIVE         
EDNSB002      20180723         40551            201807230040551        PRODUCTIVE         
EDNSB002      20180723         35112            201807230035112        PRODUCTIVE         
EDNSB002      20180723         31912            201807230031912        PRODUCTIVE         
EDNSB002      20180723         31138            201807230031138        STANDBY            
EDNSB002      20180723         23411            201807230023411        STANDBY            
EDNSB002      20180723         21546            201807230021546        STANDBY            
EDNSB002      20180723         13707            201807230013707        PRODUCTIVE         
EDNSB002      20180723         11322            201807230011322        PRODUCTIVE         
EDNSB002      20180723         5414             201807230005414        PRODUCTIVE         

Что я хочу, чтобы SQL выдал:

nenh_new_status_6  (min)                  (max)                  
-----------------------------------------------------------------
SCHED DT           201808080201230        201808080201230
STANDBY            201807230051354        201807230104731
PRODUCTIVE         201807230031912        201807230044208
STANDBY            201807230021546        201807230031138
PRODUCTIVE         201807230005414        201807230013707

Я понятия не имею, как это сделатьэтот.Я пытался исследовать все утро.Наконец, решил разместить здесь.Спасибо, Кент

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Если ваша версия 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.

Возможно, я слишком усложнил решение, но, похоже, оно дает желаемые результаты.

0 голосов
/ 10 декабря 2018
select nenh_new_status_6,
    min(nenh_trans_date*10000000+nenh_trans_time), 
    max(nenh_trans_date*10000000+nenh_trans_time)
from ntcenh
group by nenh_new_status_6
...