繁体   English   中英

历史记录表中按状态分组的SQL最小/最大日期

[英]SQL min/max date from a history table by status grouping

该查询用于显示我要使用的数据:

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

我不知道该怎么做。 我一直在努力研究整个上午。 最终决定在这里发布。 谢谢,肯特

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

如果您的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与上一行进行比较, nenh_new_status_6计算时间排序。 如果它们相等,我赋值零列changed ,否则我分配1.在虚拟表vt2我计算累积总和的列changed ,所以我对的每个范围不同值nenh_new_status_6status_group 最后,我为每个status_group计算nenh_datetimeMINMAX值。

我的解决方案可能过于复杂,但是它确实可以提供您想要的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM