大家好,
我有两个dt,我想根据来自辅助dt的数据在主dt中创建一个新列。
我想要一个JSL命令检查“dt1”日期列中的日期,并根据开始和结束日期匹配“dt2”中的组号。(大体时间)
dt1
小学)
| 日期 | 组 |
| 5/17/2019 13:06 | |
| 5/17/2019 13:06 | |
| 5/23/2019 10:02 | |
| 5/24/2019 13:47 | |
dt2
中学)
| 组 | 开始日期 | 结束日期 |
| 1 | 5/17/2019 20:15 | 5/18/2019 8:14 |
| 2 | 5/18/2019 8:15 | 5/18/2019 20:14 |
| 1 | 5/18/2019 20:15 | 5/19/2019 8:14 |
| 3 | 5/19/2019 8:15 | 5/19/2019 20:14 |
| 2 | 5/19/2019 20:15 | 5/20/2019 8:14 |
| 3 | 5/20/2019 8:15 | 5/20/2019 20:14 |
| 2 | 5/20/2019 20:15 | 5/21/2019 8:14 |
| 4 | 5/21/2019 8:15 | 5/21/2019 20:14 |
| 3 | 5/21/2019 20:15 | 5/22/2019 8:14 |
| 4 | 5/22/2019 8:15 | 5/22/2019 20:14 |
| 3 | 5/22/2019 20:15 | 5/23/2019 8:14 |
| 1 | 5/23/2019 8:15 | 5/23/2019 20:14 |
| 4 | 5/23/2019 20:15 | 5/24/2019 8:14 |
| 1 | 5/24/2019 8:15 | 5/24/2019 20:14 |
我们将非常感谢您的帮助。
你好 @ileshem ,
我有几种方法可以解决这个问题。一种方法是创建一个表,列出开始日期和结束日期之间每个时间点的组,然后您可以将该表与表>更新一起使用,通过直接匹配跨越的新日期列来引入组号开始和结束。这将涉及创建新的跨越表,并根据您有多少个日期范围,该表可能会变得非常大。
另一个选项(我在这种情况下我更喜欢)是使用Tables> JMP Query Builder,它允许我们建立一个连接,它可以使用一些SQL逻辑来匹配开始日期之后但是之前的日期。结束日期。您可以交互式地设计此查询,这是我喜欢这种方法的一个原因,因此如果您不想编写某些内容,您可以使用鼠标完成所有操作。保存脚本会产生一些不太难以概括的jsl,只需要一些技巧来获取没有扩展名的表名,并使用evalInsert()插入表名。有点奇怪,其他人可能会有更优雅的方式去做我在这里做的事情。也就是说,如果没有编写一些自定义JSL来在一个表中逐行进行查找,这是另一种方法(这是第三种,也是完全可以接受的方法)。
这是JMP查询生成器的代码,我附上了你的示例表来试试这个。如果你对如何以交互方式设置它让我知道 - 从头开始构建它需要30秒。
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
dt1NameOnly = Left( dt1 << getname, Length( dt1 << getname ) - 4 );
dt2NameOnly = Left( dt2 << getname, Length( dt2 << getname ) - 4 );
New SQL Query(
Version( 130 ),
Connection( "JMP" ),
JMP Tables( Eval Insert( "\[ [dt1<<GETNAME> "_MEMORY_", dt2<<GETNAME> "_MEMORY_"] ]\" ) ),
QueryName( "SQLQuery1" ),
Select( Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ), Column( "Group 2", "t2" ) ),
From(
Table( dt1NameOnly, Alias( "t1" ) ),
Table(
dt2NameOnly,
Alias( "t2" ),
Join(
Type( Left Outer ),
GE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "Start Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
) & LE(
Column( "date", "t1", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) ),
Column( "End Date", "t2", Numeric Format( "m/d/y h:m", "-1", "NO", "" ) )
)
)
)
)
) << Run;
</GETNAME></GETNAME>你好,我们又见面了, @ileshem ,
我提到你可以使用自定义jsl来解决这个问题,并希望通过一些For()循环共享一种方法,这些循环在主表中逐行工作,以查找符合二级表中条件的日期。有很多方法可以为非常大的应用程序更有效地执行此操作,但这是一个开始。
dt1 = Data Table( "primary.jmp" );
dt2 = Data Table( "secondary.jmp" );
For( i = 1, i <= N Row( dt1 ), i++,
For( j = 1, j <= N Row( dt2 ), j++,
If( And( dt1:date[i] >= dt2:Start Date[j], dt1:date[i] <= dt2:End Date[j] ),
dt1:Group[i] = dt2:Group[j];
Break();
)
)
);
@julian