在状态尚未更新的期间获取最远的记录状态日期

问题描述 投票:0回答:3

我试图获得记录保持在STATE'I'(无效)的最远日期,而不更新为'V'有效。这里有一个例子(DATE是desc的顺序):

--------------------------------
ID         STATE       DATE       
--------------------------------
1          I          30/01/2017
1          I          25/01/2017 <-
1          V          20/01/2017
1          I          15/01/2017
2          I          25/01/2017
2          I          20/01/2017 <-
3          I          30/01/2017 <-
3          V          15/01/2017
3          I          10/01/2017
3          I          05/01/2017

预期结果 :

--------------------------------
ID         STATE       DATE       
--------------------------------
1          I          25/01/2017
2          I          20/01/2017
3          I          30/01/2017
sql oracle select
3个回答
2
投票

试试这个:

SELECT ID,STATE ,MIN(DATE) FROM  FURTHEST  t1
WHERE STATE = 'I'
AND NOT EXISTS(SELECT *
                 FROM   FURTHEST t2
                 WHERE  state = 'V' AND 
                        t1.id = t2.id AND 
                        t1.DATE < t2.DATE)
GROUP BY ID,STATE
ORDER BY ID;

1
投票

您可以使用not exists运算符来搜索I记录未跟随的V记录,然后group by id并获取最大日期:

SELECT   id, MAX("date")
FROM     mytable a
WHERE    state = 'I' AND
         NOT EXISTS (SELECT *
                     FROM   mytable b
                     WHERE  state = 'V' AND 
                            a.id = b.id AND 
                            a."date" < b."date")
GROUP BY id

注意: date是Oracle SQL中的保留字,因此必须进行转义 - 因此使用"date"


1
投票

干得好; 01.01.1900是一个“虚构的”最小日期,用于简化某些ID没有“V”(alid)状态的情况。

SQL> WITH test (id, state, datum)
  2       AS (SELECT 1, 'I', TO_DATE ('30.01.2017', 'dd.mm.yyyy') FROM DUAL
  3           UNION
  4           SELECT 1, 'I', TO_DATE ('25.01.2017', 'dd.mm.yyyy') FROM DUAL
  5           UNION
  6           SELECT 1, 'V', TO_DATE ('20.01.2017', 'dd.mm.yyyy') FROM DUAL
  7           UNION
  8           SELECT 1, 'I', TO_DATE ('15.01.2017', 'dd.mm.yyyy') FROM DUAL
  9           UNION
 10           --
 11           SELECT 2, 'I', TO_DATE ('25.01.2017', 'dd.mm.yyyy') FROM DUAL
 12           UNION
 13           SELECT 2, 'I', TO_DATE ('20.01.2017', 'dd.mm.yyyy') FROM DUAL
 14                                                                        )
 15  SELECT id, state, datum
 16    FROM test t
 17   WHERE t.datum =
 18            (SELECT MIN (t1.datum)
 19               FROM test t1
 20              WHERE     t1.id = t.id
 21                    AND t1.state = 'I'
 22                    AND t1.datum >
 23                           (SELECT NVL (MAX (t2.datum), DATE '1900-01-01')
 24                              FROM test t2
 25                             WHERE t2.id = t.id AND t2.state = 'V'));

        ID S DATUM
---------- - ----------
         1 I 25.01.2017
         2 I 20.01.2017

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.