当前位置: 首页 > 面试题库 >

如何使用Oracle SQL执行线性插值?

唐元青
2023-03-14
问题内容

我正在尝试使用Oracle
11g(在开发中为11.1,在生产中为11.2)进行数值分析,特别是在具有三列感兴趣的表的表上进行线性插值:时间戳,设备ID和值。

值列保存来自设备的数据(标识为deviceid),该数据是在时间戳记中指定的时间获取的。例如,这是伪数据,但是它给出了这样的想法:

     time       |  deviceid  |  value   
----------------|------------|-----------
 01:00:00.000   |  001       | 1.000
 01:00:01.000   |  001       | 1.030
 01:00:02.000   |  001       | 1.063 
 01:00:00.050   |  002       | 553.10
 01:00:01.355   |  002       | 552.30
 01:00:02.155   |  002       | 552.43

来自设备001的时间戳与设备002的时间戳不匹配,但是我需要将来自设备001和002的值放在一行中,并带有一个时间戳,与设备001的时间戳匹配。我要结束的是像这样的东西:

     time       |  device 001  |  device 002   
----------------|--------------|------------
 01:00:00.000   |  1.000       |  null
 01:00:01.000   |  1.030       |  552.520
 01:00:02.000   |  1.063       |  552.405

其中,基于在设备001的每个时间戳的任一侧的两个最接近的时间戳处收集的设备002的值对设备002的值进行线性插值。之所以会出现空值,是因为我在设备001的任一侧都没有两个时间戳01:00:00.000,我不想外推该值。

据我了解,我可以使用percentile_cont来执行此操作,但是我不理解我在网上看到的示例。例如,percentile_cont使用的百分位数从何而来?

在此先感谢您的帮助!


问题答案:

我不确定您将如何PERCENTILE_CONT执行所需的插值,但是借助其他分析功能,您可以实现所需的插值。

首先,我们将创建以下函数,该函数将INTERVAL DAY TO SECOND值转换为秒:

CREATE OR REPLACE FUNCTION intvl_to_seconds(
    p_interval INTERVAL DAY TO SECOND
) RETURN NUMBER DETERMINISTIC
AS
BEGIN
  RETURN EXTRACT(DAY FROM p_interval) * 24*60*60
       + EXTRACT(HOUR FROM p_interval) * 60*60
       + EXTRACT(MINUTE FROM p_interval) * 60
       + EXTRACT(SECOND FROM p_interval);
END;
/

通过此功能,我们可以使用如下查询:

SELECT d1.time,
       d1.value AS value1,
       q2.prev_value + intvl_to_seconds(d1.time - q2.prev_time) * (q2.next_value - q2.prev_value)/intvl_to_seconds(q2.next_time - q2.prev_time) AS value2
  FROM devices d1
  LEFT OUTER JOIN (SELECT d2.time AS prev_time,
                          d2.value AS prev_value,
                          LEAD(d2.time, 1) OVER (ORDER BY d2.time) AS next_time,
                          LEAD(d2.value, 1) OVER (ORDER BY d2.time) AS next_value
                     FROM devices d2
                    WHERE d2.deviceid = 2) q2
               ON d1.time BETWEEN q2.prev_time AND q2.next_time
 WHERE d1.deviceid = 1;

我在上面获取了您的数据,将时间戳记的日期部分设置为今天,当我运行上面的查询时,得到了以下结果:

TO_CHAR(D1.TIME)VALUE1 VALUE2
------------------------------------- ---------- --- -------
2011年9月9日01.00.00.000000 1
2011年9月9日01.00.01.000000 1.03 552.517625
2011年9月9日01.00.02.000000 1.063 552.404813

(我添加了一个TO_CHAR环绕d1.time以减少SQL * Plus中过多的间距。)

如果您使用DATEs而不是TIMESTAMPs,则不需要此函数:您可以减去日期。



 类似资料:
  • 问题内容: 我想使用python执行blinear插值。 我要插入高度的示例gps点是: 使用具有已知坐标和高度值的四个相邻点: 这是我的原始尝试: 其中z0和z1 我得到31.964,但从其他软件得到31.961。 我的脚本正确吗? 您可以提供另一种方法吗? 问题答案: 这是您可以使用的可重用功能。它包括doctest和数据验证: 您可以通过添加以下内容来运行测试代码: 在数据集上运行插值将产生

  • 问题内容: 假设我得到的数据如下: 我想设计一个函数,该函数将使用Python在和,至之间进行线性插值。 我曾尝试浏览本Python教程,但仍然无法理解。 问题答案: 据我了解您的问题,您想编写一些函数,这将给您带来一些价值?然后,基本思路如下: 查找定义了包含的间隔的值的索引。例如,对于您的示例列表,包含间隔为,索引为, 用(即)计算该间隔的斜率。 的值在是现在值加上斜率乘以从距离。 您还需要确

  • 问题内容: 摘要: 当在线程中引发断言错误时,单元测试不会消失。这是有道理的,因为不应允许一个线程使另一线程崩溃。问题是我该如何1)当第一个帮助程序线程崩溃时使整个测试失败,或者2)遍历并确定每个线程完成后的状态(请参见下面的代码)。后者的一种方法是通过每个线程具有状态变量,例如“ boolean [] statuss”,并具有“ statuses [i] == false”表示线程失败(可以扩展

  • 本文向大家介绍如何执行批量插入?相关面试题,主要包含被问及如何执行批量插入?时的应答技巧和注意事项,需要的朋友参考一下 首先,创建一个简单的 insert 语句:   然后在 java 代码中像下面这样执行批处理插入:

  • 如何执行cucumber从maven与标签? 我试过的是 mvn清洁测试-Dcucumber。滤器tags=“@TestTag” 我的pom.xmltestng.xml文件,(是否有一种方法可以避免执行脚本from.xml文件,并直接使用场景或功能文件的标记名称?) 使用cucumber.io7.0.0

  • 我是一名学生,开始学习线性回归。我们得到了一个手动回归公式:(X.T*X)**-1*X.T*y还有一个简单数组的例子: 现在我想用Boston数据集对多个变量做同样的处理。我需要创建一个类,该类的功能与LinearRegression()相同。一定有。fit()方法和。预测方法。当数组有超过1列时,如何操作没有任何解释。。。所以我很困惑。 以下是我最初所做的: 但它只返回1个系数,我不确定它是否正