1

我正在寻找为 Oracle DB 编写查询的正确方法。

它应该为每个唯一日期(dateCol 列)选择最后一行,以使 dateCol2 的时间部分低于“17:30”

select * from table where dateCol between to_date('2013-01-01 00:00:00','YYYY-MM-DD H24:MI:SS') and to_date('2013-02-01 00:00:00','YYYY-MM-DD H24:MI:SS') 
and id='myID' 
and [MISSING PART = the last line such that timepart(dateCol2)<'17:30']

我对 Oracle/SQL 很陌生,所以我的问题可能会遗漏很多东西,我会根据任何要求添加任何内容。

编辑:到目前为止,我明白这一点:

  select * from (select table.*, row_number() over (order by dateCol2 desc) last_row from table
  where dateCol between to_date('2013-01-01 00:00:00','YYYY-MM-DD H24:MI:SS') 
                    and to_date('2013-02-01 00:00:00','YYYY-MM-DD H24:MI:SS') 
                    and id='myID' 
                    and to_char(dateCol2, 'hh24:mi') < '17:30')
  where last_row = 1
  group by dateCol
  )
4

4 回答 4

2

如果您只存储日期datecol(即当您插入 TRUNC 日期时),则不需要介于两者之间。如果您也在其中存储非零时间,那么两者之间也需要调整。

要检查时间,只需将日期转换为表单hh24mi中的数字(生成介于 0 和 2359 之间的数字)并检查是否小于 1730

如果datecol日期有非 00:00:00 时间元素:

select distinct dateCol 
  from table 
 where dateCol >= to_date('2013-01-01','YYYY-MM-DD') 
   and dateCol < to_date('2013-01-01','YYYY-MM-DD') + 1
   and id='myID' 
   and to_number(to_char(dateCol2, 'hh24mi')) < 1730;

如果datecol总是以 00:00:00 作为时间的日期,则:

select distinct dateCol 
  from table 
 where dateCol = to_date('2013-01-01','YYYY-MM-DD') 
   and id='myID' 
   and to_number(to_char(dateCol2, 'hh24mi')) < 1730;

从澄清编辑

select *
  from (select t.*, row_number() over (partition by datecol 
                                       order by dateCol2) first_row,
               row_number() over (partition by datecol 
                                  order by dateCol2 desc) last_row
          from table t
         where dateCol = to_date('2013-01-01','YYYY-MM-DD') 
           and id='myID' 
           and to_number(to_char(dateCol2, 'hh24mi')) < 1730)
 where first_row = 1
    or last_row = 1;
于 2013-04-03T09:30:26.643 回答
1

如果您想在 17:30 之前为每个日期(dateCol)选择最近 dateCol2 的整行,我会选择类似

   select * 
     from table
    where (dateCol, dateCol2)  in (
        select dateCol, max(dateCol2) 
          from table 
         where dateCol between to_date('2013-01-01','YYYY-MM-DD') 
                           and to_date('2013-01-01','YYYY-MM-DD') 
           and id='myID' 
           and to_char(dateCol2, 'hh24:mi') < '17:30'
         group by dateCol
    )

不确定您在同一日期的中间条件,但我认为您只是在同一日期输入了两次。

编辑:

       select * 
         from table t
  innner join (
            select dateCol, 
                   min(dateCol2) first, 
                   max(dateCol2) last
              from table 
             where trunc(dateCol) = to_date('2013-01-01','YYYY-MM-DD') 
               and id='myID' 
               and to_char(dateCol2, 'hh24:mi') < '17:30'
             group by dateCol
              ) 
              sub s
           on t.dateCol  = s.dateCol
          and (t.dateCol2 = s.first
            or t.dateCol2 = s.last)
于 2013-04-03T09:41:38.763 回答
1

我认为你可以这样做,即使它不是很聪明...... dateCol

select * from table 
where dateCol between to_date('2013-01-01','YYYY-MM-DD') 
                  and to_date('2013-01-01','YYYY-MMDD') 
and id='myID' and dateCol<trunc(dateCol)+17.5/24
于 2013-04-03T09:44:54.367 回答
0
    选择截断(t.dateCol),
       max(t.your_column) 保持(t.dateCol 的最后一个密集排序)
    从表 t
    其中 t.dateCol 在 to_date('2013-01-01','YYYY-MM-DD') 和 to_date('2013-05-01','YYYY-MM-DD') 之间
      和 t.id='myID'
      和 t.dateCol
于 2013-04-03T10:43:29.507 回答