在条件基础上从数据库获取最大日期

时间:2018-02-16 21:33:54

标签: 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;

获得此日期后,我获得了此日期的标志

select flag from table where date=max_date

我想要一个聪明/更好的方法来做到这一点

2 个答案:

答案 0 :(得分:1)

lagcase表达式一起使用。

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

答案 1 :(得分:0)

private void listViewItemLongClick() { ListView myList = (ListView) findViewById(R.id.listView); myList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { mDatabaseHelper.deleteRow(id); populateListView(); } }); } 是一个不错的选择,但如果您不想使用任何分析函数,则可能必须使用多个连接。

您想要一个前一个标志值为零的情况,但您不必在您的问题中给出一个示例或预期输出。无论如何我已经添加了它。

SQL Fiddle

Oracle 11g R2架构设置

LAG

查询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

<强> Results

     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