【发布时间】:2017-08-25 03:22:56
【问题描述】:
我有一个 Oracle DB 表结构,其中包含通过面试过程填充的行,每个“客户”都可以多次完成面试过程,甚至在同一天。表结构如下所示:
Table: Customers
-------------
CustomerId
...
Table: Questions
-------------
QuestionId | QuestionText
0 | Last Location?
1 | Last Color?
2 | Last Food?
3 | Last Drink?
Table: Answers
-------------
Id | CustomerId | QuestionId | AnswerText | Created_On
1 0 0 Chicago 08/15/2017 7:56:34 AM
2 0 0 Laramie 08/16/2017 9:27:23 AM
3 0 0 Null 08/17/2017 6:34:56 AM
4 0 1 Null 08/15/2017 7:56:34 AM
5 0 1 Green 08/16/2017 9:27:23 AM
6 0 1 Blue 08/17/2017 6:34:56 AM
7 0 2 Pizza 08/15/2017 7:56:34 AM
8 0 2 Null 08/16/2017 9:27:23 AM
9 0 2 Null 08/17/2017 6:34:56 AM
10 0 3 Null 08/15/2017 7:56:34 AM
11 0 3 Null 08/16/2017 9:27:23 AM
12 0 3 Null 08/17/2017 6:34:56 AM
目前我们通过查询每个问题的最新时间戳的数据来显示“最后一次采访”,并显示结果,无论它是有值还是为空,如下所示:
LastAnswer_QueryResult
-------------
Id | CustomerId | QuestionId | AnswerText | Created_On
3 0 0 Null 08/17/2017 6:34:56 AM
6 0 1 Blue 08/17/2017 6:34:56 AM
9 0 2 Null 08/17/2017 6:34:56 AM
12 0 3 Null 08/17/2017 6:34:56 AM
新的要求是为每个问题显示一个值的最新答案,如果该问题从未被回答,则为 null。如果我能正确查询,上面示例数据的结果将如下所示:
MostRecentAnswer_QueryResult
Id | CustomerId | QuestionId | AnswerText | Created_On
2 0 0 Laramie 08/16/2017 9:27:23 AM
6 0 1 Blue 08/17/2017 6:34:56 AM
7 0 2 Pizza 08/15/2017 7:56:34 AM
12 0 3 Null 08/17/2017 6:34:56 AM
到目前为止,我能想到的最佳方法是将最旧的行插入临时表中,然后在循环中更新这些值(如果它们存在)并使用较新的时间戳。然后完成后,使用最新的时间戳更新任何空值。有没有一种方法可以在不循环并插入临时表的情况下完成此操作?
【问题讨论】: