【发布时间】:2018-12-22 09:52:01
【问题描述】:
我正在尝试为以下场景编写 sql 查询。如果能得到任何帮助,那就太好了。
场景:
我有一个表(emp),它有三列 id、time 和 value。表中没有主键。 time 是一个包含日期和时间戳的日期列。
表格将从下午开始更新。所以从早上到下午,表中都会有昨天的数据。在插入当前数据之前,所有昨天的行都将被清除,并且表格将从中午到晚上开始动态更新。但是我需要从早上开始运行查询,并且我的查询不应该获取昨天的数据。因此,理想情况下,从早上到下午,我应该等待数据到来,并且不应该获取任何行,并在将当前日期数据插入其中后开始获取。
我需要每五分钟运行一次查询,当我运行查询时,我应该获取表中的所有最新行,这样每当表中有更新时,就会获取这些行。
例如,当表格从下午 1 点开始更新时。当我开始第一个查询时,我应该得到所有的行,五分钟后,当我在 1.05 再次运行相同的查询时,我应该得到在下午 1 点到 1.05 点之间插入的所有行。
我的想法:
从 emp 中选择 max(time);
在一天开始时,我应该检查表格中的最大时间,它肯定是昨天的日期,所以我将在局部变量中设置今天的日期(2018-07-14 00:00:00),或者如果它是今天的日期,那么该值将存储在局部变量中。
我也可以在上面的查询中做同样的事情,方法是将它与下面的查询中的 sysdate 进行比较,但我不确定性能,因为我通过与我猜想的所有行进行比较需要时间。请参阅下面修改后的上述查询
select max(time) from emp where time = sysdate;
从表中获取最大时间后,将其设置为一个变量,即lastquerytime,然后查询具有大于此时间戳的行的表,以便我们可以每五分钟获取所有最新的行。
Select id,time,value from emp where time > lastquerytime;
所以想法是获取所有行并检查其中的最大时间戳,并在下次查询表中时间戳大于此最大时间戳的行。像这样需要每五分钟做一次,直到一天结束。
现在我使用两个查询来实现这个场景。 为这种情况编写更好的方法和查询的任何建议都会对我有很大帮助。
【问题讨论】:
-
通过编辑问题提供示例数据和预期输出。
-
是否应该在午夜之后运行查询以获取昨天最后几分钟的未见数据?还是那些丢失并且永远不会找回的?如果今天的第一次更新在查询看到之前清除了昨天的数据,也会发生这种情况。不确定我是否完全理解您的模型。
-
问题不清楚。您想定期(每 5 分钟)运行一次查询并获取新数据吗?上次运行后添加的数据?是否始终使用当前时间添加数据(即
SYSDATE用于填充TIME列)?TIME列是什么类型?DATE或TIMESTAMP还是什么? -
@Hilarion :是的,定期查询应该每 5 分钟运行一次以获取最新的行。是的,数据将与当前日期和时间一起添加。即使我有日期列,它也会有日期和时间戳值。例如,在下午 1 点,当我运行查询时,它应该获取表中的所有行。当我在 5 分钟后再次查询时,即 01.05 PM,它应该获取在 1.00 PM 和 1.05 PM 之间插入的行。同样,它应该持续到一天结束。希望我试图让你明白。如果没有,请告诉我。