大家好,
我有兩個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