我有列sr, event_id, category, date, location, Done_YN
等的表格事件,其中category
的单字符编码为D
,N
,A
,{{1 },或E
(具有以下含义:白天,黑夜,下午,晚上,全天)。
我的问题是我应该如何编写我的SQL查询(对于Oracle 10g)来获取ID,最近'Day'事件的DATE以及之前的'Night'类别事件ID和在同一位置Id完成的日期。
答案 0 :(得分:0)
因为您有一个名为date
和Done_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