Sql 根据条件从数据库中获取最长日期

Sql 根据条件从数据库中获取最长日期,sql,oracle,Sql,Oracle,我的表中有一个标志和日期组合,所以我的表是这样的 DATE FLAG ---------------- 01-JAN-18 1 02-JAN-18 0.5 03-JAN-18 3 06-JAN-18 9 我需要一个针对该表的SQL查询,该查询根据表中上一个最长日期是否带有标志0,为特定日期返回0或1 我已经试过了——第一次是在某一天的前一天- max_date = select max(date) from table where date < input

我的表中有一个标志和日期组合,所以我的表是这样的

DATE        FLAG 
----------------
01-JAN-18   1
02-JAN-18   0.5
03-JAN-18   3
06-JAN-18   9
我需要一个针对该表的SQL查询,该查询根据表中上一个最长日期是否带有标志0,为特定日期返回0或1

我已经试过了——第一次是在某一天的前一天-

max_date = select max(date) from table where date < input_date;

我想要一个智能/更好的方法来实现这一点

使用
lag
case
表达式

select dt,flag,case when lag(flag) over(order by dt) = 0 then 1 else 0 end as prev_zero_or_not
from tbl 

LAG
是一个很好的选择,但如果不希望使用任何分析函数,则可能必须使用多个联接

您希望前面的标志值为零,但不必在问题中给出一个示例或预期输出。反正我已经加了

Oracle 11g R2架构设置

create table yourtable as 
select TO_DATE ('01-JAN-2018','DD-MON-YYYY') dt, 1 flag from dual UNION ALL
select TO_DATE ('02-JAN-2018','DD-MON-YYYY'), 0.5 from dual UNION ALL
select TO_DATE ('03-JAN-2018','DD-MON-YYYY'), 3  from dual UNION ALL
select TO_DATE ('06-JAN-2018','DD-MON-YYYY'), 9  from dual UNION ALL
select TO_DATE ('08-JAN-2018','DD-MON-YYYY'), 0  from dual UNION ALL
select TO_DATE ('11-JAN-2018','DD-MON-YYYY'), 7  from dual UNION ALL
select TO_DATE ('14-JAN-2018','DD-MON-YYYY'), 12 from dual
     SELECT s.dt,s.flag,
           CASE
             WHEN t.flag = 0 THEN 1
             ELSE 0
           END is_prev_dt_flag_zero
    FROM   yourtable t
           RIGHT OUTER JOIN (SELECT a.dt,MAX(a.flag) flag,
                              Max(b.dt) prev_date
                       FROM   yourtable a
                              LEFT OUTER JOIN yourtable b
                                     ON b.dt < a.dt
                       GROUP  BY a.dt) s
                   ON t.dt = s.prev_date
    ORDER  BY s.dt
|                   DT | FLAG | IS_PREV_DT_FLAG_ZERO |
|----------------------|------|----------------------|
| 2018-01-01T00:00:00Z |    1 |                    0 |
| 2018-01-02T00:00:00Z |  0.5 |                    0 |
| 2018-01-03T00:00:00Z |    3 |                    0 |
| 2018-01-06T00:00:00Z |    9 |                    0 |
| 2018-01-08T00:00:00Z |    0 |                    0 |
| 2018-01-11T00:00:00Z |    7 |                    1 |
| 2018-01-14T00:00:00Z |   12 |                    0 |
查询1

create table yourtable as 
select TO_DATE ('01-JAN-2018','DD-MON-YYYY') dt, 1 flag from dual UNION ALL
select TO_DATE ('02-JAN-2018','DD-MON-YYYY'), 0.5 from dual UNION ALL
select TO_DATE ('03-JAN-2018','DD-MON-YYYY'), 3  from dual UNION ALL
select TO_DATE ('06-JAN-2018','DD-MON-YYYY'), 9  from dual UNION ALL
select TO_DATE ('08-JAN-2018','DD-MON-YYYY'), 0  from dual UNION ALL
select TO_DATE ('11-JAN-2018','DD-MON-YYYY'), 7  from dual UNION ALL
select TO_DATE ('14-JAN-2018','DD-MON-YYYY'), 12 from dual
     SELECT s.dt,s.flag,
           CASE
             WHEN t.flag = 0 THEN 1
             ELSE 0
           END is_prev_dt_flag_zero
    FROM   yourtable t
           RIGHT OUTER JOIN (SELECT a.dt,MAX(a.flag) flag,
                              Max(b.dt) prev_date
                       FROM   yourtable a
                              LEFT OUTER JOIN yourtable b
                                     ON b.dt < a.dt
                       GROUP  BY a.dt) s
                   ON t.dt = s.prev_date
    ORDER  BY s.dt
|                   DT | FLAG | IS_PREV_DT_FLAG_ZERO |
|----------------------|------|----------------------|
| 2018-01-01T00:00:00Z |    1 |                    0 |
| 2018-01-02T00:00:00Z |  0.5 |                    0 |
| 2018-01-03T00:00:00Z |    3 |                    0 |
| 2018-01-06T00:00:00Z |    9 |                    0 |
| 2018-01-08T00:00:00Z |    0 |                    0 |
| 2018-01-11T00:00:00Z |    7 |                    1 |
| 2018-01-14T00:00:00Z |   12 |                    0 |

您需要什么作为输出?到目前为止你试过什么?请将这些细节添加到问题中。我希望我的代码对像我这样具有基本SQL知识的其他人来说是可以理解的,如果我需要在查询或其他方面进行更改,我必须去阅读滞后是如何工作的else@pratish_v:这是一个不使用现代SQL功能的非常糟糕的理由,这些功能在中国已经存在了20多年Oracle@a_horse_with_no_name谢谢,我终于使用了lag,因为它比我的任何其他解决方案都有效