Oracle 10g:在以前的行中搜索

时间:2015-03-14 19:11:27

标签: sql oracle

我有列sr, event_id, category, date, location, Done_YN等的表格事件,其中category的单字符编码为DNA,{{1 },或E(具有以下含义:白天,黑夜,下午,晚上,全天)。

我的问题是我应该如何编写我的SQL查询(对于Oracle 10g)来获取ID,最近'Day'事件的DATE以及之前的'Night'类别事件ID和在同一位置Id完成的日期。

2 个答案:

答案 0 :(得分:0)

因为您有一个名为dateDone_YN的列我假设您实际使用了区分大小写的标识符,所以:

SELECT "event_id", "date"
FROM   "events"
WHERE  ("date" >= TRUNC(SYSDATE)
        AND "date" < TRUNC(SYSDATE+1) /*today*/
        AND "category" = 'D' /*Day*/)
OR     ("date" >= TRUNC(SYSDATE-1)
        AND "date" < TRUNC(SYSDATE) /*yesterday*/
        AND "category" = 'N' /*Night*/);

如果您添加location,那么您应该可以按位置对这些内容进行排序,以找到共同发生的事件。

答案 1 :(得分:0)

下面是查询,其中我使用row_number()函数枚举按位置和类别按日期降序分区的事件。 接下来我只拍了最后一个事件(row_number = 1)。

外部查询根据位置加入日夜事件。如果只发现一天或者只有夜间事件,则使用完全连接,因此我们在第二部分中列出空值(就像我的示例中的位置LA)。

我将您的“日期”列重命名为edate,因为date是保留字,最好避免将其作为列名。

with ev as (
  select * from (
      select sr, event_id, category, edate, location,
          row_number() over (partition by location, category order by edate desc) rn
        from events where category in ('D', 'N') )
    where rn=1)
select location, dev.event_id day_event_id, dev.edate day_event_date, 
    nev.event_id ngt_event_id, nev.edate ngt_event_date
  from (select * from ev where category = 'D') dev
    full join (select * from ev where category = 'N') nev using (location)

示例结果:

LOCATION  DAY_EVENT_ID  DAY_EVENT_DATE  NGT_EVENT_ID  NGT_EVENT_DATE
--------  ------------  --------------  ------------  --------------
NY                   1  2015-01-01                 7  2015-01-07
LA                   6  2015-01-06

SQLFiddle