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

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

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

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

请注意,她统计高尔夫球手的日期与平均高温读数的日期并不对应。对于她统计高尔夫球手的每个日期,我想要做的是找到该周初的温度读数。如果我用条件“Week <= TestDate”连接两个表,使用以下 SQL:
SELECT t2.TestDate, t1.Week
FROM dbo.Golfers t2
LEFT OUTER JOIN dbo.AvgHighTemps t1
ON ( t1.Week <= t2.TestDate )
ORDER BY t2.TestDate ASC;
我会得到一个看起来像这样的表:

请注意,每个 TestDate 现在都有多个匹配周。但是,如果我取出具有小于 TestDate 的最大周日期的行,那将是我想要的周。我可以用这个 SQL 来做到这一点:
SELECT t2.TestDate, MAX(t1.Week) AS Week
FROM dbo.AvgHighTemps t1
FULL OUTER JOIN dbo.Golfers t2
ON ( t2.TestDate >= t1.Week )
GROUP BY t2.TestDate
ORDER BY t2.TestDate ASC;
结果表如下所示:

现在是棘手的部分。我需要将该查询用作子查询,将其他两个表连接到其中,以获得我想要的结果。这是 SQL:
SELECT t1.Week, t1.AvgHighTemp, t2.TestDate, t2.NGolfers
FROM (
SELECT t1.TestDate, MAX(t2.Week) as TempWeek
FROM dbo.Golfers t1
LEFT OUTER JOIN dbo.AvgHighTemps t2
ON ( t2.Week <= t1.TestDate )
GROUP BY t1.TestDate
) tempFinder
RIGHT OUTER JOIN dbo.AvgHighTemps t1
ON t1.Week = tempFinder.TempWeek
RIGHT OUTER JOIN dbo.Golfers t2
ON t2.TestDate = tempFinder.TestDate
;
结果是一个表格,其中包含高尔夫球手的数量和相应周的平均气温:

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