嗨肯尼迪3,
如果您正在寻找一种手动执行此操作的方法,以下方法(可以轻松编写脚本)应该适合您。下面的公式将“更改级别”的值向下复制到新的公式列,直到它遇到具有新“更改级别”的时间戳。
假设:表 1 和表 2 具有相同的日期列名称;
在下面的步骤中,表 1 有一列名为“更改级别”
第 1 步:使用 Tables => Concatenate 将一个表附加到另一个表
第 2 步:使用 Tables => Sort 按日期对新表进行排序
步骤 3:使用以下公式在结果表中创建一个公式列:
(在上面的公式中,新的公式列称为“第3列”)
如果您不想在结果表中保留表 1 中的信息(即,如果它只是一个“查找”表),您可以从“更改级别”列中选择所有非缺失行并删除它们。
希望这可以帮助…
我在监控家中的各种传感器时遇到了类似的问题。我在整个房子里有 5 个传感器,用于测量温度、湿度和照明。它们每 8 分钟将测量值发送到一个中央集线器 (SmartThings),除非该值与之前的值没有变化。我还有一个连续功率计,用于测量房屋的电力利用率。
我处理这个问题的方法是建立一个“一年 5 分钟”的 JMP 数据表,它在一年中每 5 分钟就有一个样本。然后我使用脚本将 20 个传感器的值插入到今年的 5 分钟表中。因此,如果我在某个传感器的特定样本上有读数,则它会被记录下来,如果没有,则存在缺失值。
5分钟的年份:

我有另一个脚本,它让我可视化“传感器健康”——基本上是一个“IsMissing”检查。当我遇到网络问题、传感器问题等时,这会让我知道。这是非常有帮助的。并且还可视化我的加入是否有效。

所以基本上策略是在我的测量中(每分钟)的最短时间间隔内使用主采样表,并将每个传感器连接到该主表。
我认为这是“交错”而不是“加入”,并且肯定有不止一种结果可能是可取的。
我挖出了一些我认为接近你想要的旧代码。此外,即使在 JSL 的世界中,也有到达你想去的地方的好方法和坏方法。因此,作为 Eric 方法的替代方法,请参见下文。我确信它可以变得更有效率,这可能是其他人可能想尝试的东西。. .
名称默认到这里( 1 ) ;
// 在两个表中创建一些“日期”数据
非= 100 ;
瓦尔斯= J (非, 1 ,随机整数(日期DMY ( 1 , 1 , 2014年) ,日期DMY ( 31 , 12 , 2014年))) ;
精细=新表( “2014 年的日期和时间 - 很好” ,
新列( “日期” ,数字,连续,
格式( “ddMonyyyy h:m:s” , 22 , 0 ) ,
输入格式( “ddMonyyyy h:m:s” , 0 ) ,
价值观(瓦尔斯)
)
) ;
数控= 10 ;
瓦尔斯= J (数控, 1 ,随机整数(日期DMY ( 1 , 1 , 2014年) ,日期DMY ( 31 , 12 , 2014年))) ;
粗调=新表( “2014 年的日期和时间 - 粗略” ,
新列( “日期” ,数字,连续,
格式( “ddMonyyyy h:m:s” , 22 , 0 ) ,
输入格式( “ddMonyyyy h:m:s” , 0 ) ,
价值观(瓦尔斯)
) ,
新列( “温度” ,数字,连续,公式(随机正态( 18 , 2 )))
) ;
精细<<种类(经过( :日期) ,命令(上升) ,替换表) ;
粗调<<种类(经过( :日期) ,命令(上升) ,替换表) ;
// **************************************************** ****************************************************** ****
// 将粗数据与细数据交错
// **************************************************** ****************************************************** ****
// 将 dtCoarse 中的列添加到 dtFine
等待( 3 ) ;
n = NCol (精细) ;
列=粗调<<获取列名( “细绳” ) ;
为了( C = 1 , C <= NItems (列) , C ++,
数据类型=柱子(粗调,列[ C ]) <<获取数据类型;
类型=柱子(粗调,列[ C ]) <<获取建模类型;
添加Col =表达式(精细<<新列(列[ C ] ,数据类型,类型,格式待定)) ;
代入(添加Col ,表达式(格式待定) ,柱子(粗调,列[ C ]) <<获取格式) ;
添加Col ;
) ;
// **************************************************** ****************************************************** ****
// 逻辑依赖于按升序排列的两个表!
// **************************************************** ****************************************************** ****
精细DT =柱子(精细, “日期” ) <<获取值;
粗DT =柱子(粗调, “日期” ) <<获取值;
如果(
// dtCoarse 中的任何时间都不晚于 dtFine 中的最早时间,因此在后者的第一行插入值
最大限度(粗DT ) <最小(精细DT ) ,
为了( C = 1 , C <= NItems (列) , C ++,
柱子(精细, n + C )[ 1 ] =柱子(粗调,列[ C ])[行(粗调)] ;
) ,
// 别的 。. .
// pos 将包含 dtFine 中应插入 dtCoarse 中的值的行的位置。
//(注意:如果pos中的某个值大于NRow(dtFine),则不会向后者添加任何行,也不会产生错误结果)。
位置=已排序(精细DT ,粗DT ) ;
位置=位置+ J (行(位置) , 1 , 1 ) ;
// 在单元格中插入值
为了(磷= 1 ,磷<=行(位置) ,磷++,
为了( C = 1 , C <= NItems (列) , C ++,
柱子(精细, n + C )[位置[磷]] =柱子(粗调,列[ C ])[磷] ;
) ;
) ;
) ;
嘿,肯尼迪3,
我认为这是一个普遍的问题,因为传感器只记录电平的变化,而不是记录电平的变化,即使以固定的间隔不变,所以我决定考虑一下。 我知道如何做到这一点的唯一方法是使用复合查询,该查询对于大型表可能效率低得令人望而却步,或者您可以想出一种可能更高效的变体。
下面是一个例子:假设我经营一个乡村俱乐部,我正在研究高尔夫球手的数量与温度之间的关系。 我所拥有的温度数据只是一个每周平均温度的表格:

对于高尔夫球手的数量,我有一个暑期学生在随机的日子里为我工作,我让她计算高尔夫球手的数量。 这是她的数据:

请注意,她计算高尔夫球手的日期与平均高温读数的日期不符。 我想为她计算高尔夫球手的每个日期做的是找到那一周开始的温度读数。 如果我使用条件“Week <= TestDate”连接两个表,请使用以下 SQL:
选择 t2.TestDate, t1.Week
从 dbo.Golfers t2
左外连接 dbo.AvgHighTemps t1
ON ( t1.Week <= t2.TestDate )
按 t2.TestDate ASC 排序;
我会得到一个看起来像这样的表:

请注意,每个 TestDate 现在都有多个匹配的周。 但是,如果我拉出最大周日期小于 TestDate 的行,那将是我想要的一周。 我可以用这个 SQL 做到这一点:
选择 t2.TestDate, MAX(t1.Week) 作为周
从 dbo.AvgHighTemps t1
完全外部连接 dbo.Golfers t2
ON ( t2.TestDate >= t1.Week )
按 t2.TestDate 分组
按 t2.TestDate ASC 排序;
结果表如下所示:

现在是棘手的部分。 我需要将该查询用作子查询,将其他两个表加入其中,以获得我想要的结果。 这是SQL:
选择 t1.Week、t1.AvgHighTemp、t2.TestDate、t2.NGolfers
从 (
选择 t1.TestDate, MAX(t2.Week) 作为 TempWeek
从 dbo.Golfers t1
左外连接 dbo.AvgHighTemps t2
ON ( t2.Week <= t1.TestDate )
按 t1.TestDate 分组
) 临时查找器
右外连接 dbo.AvgHighTemps t1
ON t1.Week = tempFinder.TempWeek
右外连接 dbo.Golfers t2
ON t2.TestDate = tempFinder.TestDate
;
结果是一个表,其中包含高尔夫球手的数量和相应周的平均温度:

到达那里需要一些工作,但我个人不知道其他方法可以做到这一点。
希望这可以帮助,
埃里克