如何基于id合并两个表,然后从第二个表中获取日期值

时间:2018-09-10 09:38:49

标签: oracle oracle11g oracle12c

我有两个桌子

Table 1 - student_id number, class_type varchar2(10), class_time date, attn_time date.

Table 2 - student_id number, attendance varchar2(5), attn_recorded_time date.

我在这里生成报告,需要根据特定条件打印表1中的所有值以及表2中的附加信息或匹配值record_time。

  SELECT a.student_id ,
  a.class_type,
  a.class_time,
  b.attn_recorded_time
FROM student_details a
LEFT JOIN attendance_details b
ON a.student_id    = b.student_id
WHERE a.class_time > b.attn_recorded_time
AND b.attn_recorded_time BETWEEN a.class_time AND (a.class_time - 1/24)
ORDER BY a.student_id,
  a.class_time;

所以这里的条件是class_time应该总是大于出勤时间,并且应该在class_time和class_time之间-1小时。

我正在尝试使用merge语句实现

merge INTO student_details a USING attendance_details b ON (a.student_id = b.student_id)
WHEN matched THEN 
update set a.attn_time = b.attn_recorded_time
where b.attn_recorded_time between a.class_time and a.class_time- 1/24;

表1的数据

Student_id   class_type  class_time            attn_time
   1203       English    2018-09-10 11:00:00   
   1203       Maths      2018-09-10 11:30:00   

表2的数据

Student_id    attendance    attendance_recorded_time
1203             Y          2018-09-10 10:00:00
1203             Y          2018-09-10 11:00:00
1203             Y          2018-09-10 08:00:00
1203             Y          2018-09-10 09:00:00

必填数据

Student_id     class_type  class_time             attn_time         
1203             English   2018-09-10 11:00:00    2018-09-10 10:00:00
1203             Maths     2018-09-10 11:30:00    2018-09-10 11:00:00

即使同一学生ID 1203可以使用多个数据,我也需要基于class_time检索最新的勤工记录时间

如何实现上述输出,我在这里做错了什么?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

在您的where条件下,将较低的值放在between中,或按以下所示操作:

demo

select * 
    from student_details a
    join attendance_details b using (student_id)
    where class_time - interval '1' hour <= attn_recorded_time 
      and attn_recorded_time < class_time

答案 1 :(得分:0)

请按以下方式尝试获得所需的输出。

data = df.loc[:, ~df.columns.str.contains('^Unnamed')]
print(data)