你好,
我想完成一些我认为非常简单的事情:根据日期连接表。
假设我有以下表格:
表 1 - 具有以下列:Group1、event_date。
表 2 - 具有以下列:Group2、start_date、end_date。
我希望联接按如下方式工作: (Group1 == Group2) AND (start_date < date < end_date)
如何使用 JSL 代码完成此任务?
谢谢
完美的! 我不知道您可以在 JMP 中使用 SQL 语法。 从现在开始,这将使我的生活变得更加轻松。
谢谢
我认为查询这个并为连接编写一些 SQL 是最简单的
Names Default To Here(1);
// Using aliases, performing a join
dtSAT = Open("$SAMPLE_DATA/SATByYear.jmp", Invisible);
dtUS = Open("$SAMPLE_DATA/US Demographics.jmp", Invisible);
Query(
Table(dtSAT, "t1"),
Table(dtUS, "t2"),
"\[SELECT t1.State, t1."SAT Math", t2."College Degrees",
t2."Eighth Grade Math"
FROM t1
LEFT OUTER JOIN t2
ON t1.State = t2.State
WHERE t1.'SAT Math' > 550;
]\"
);
它不是唯一的选择,但它应该相当简单且易于理解(如果您了解 SQL)。
编辑:
根据表的大小,您还可以执行左连接(或完全连接),然后删除未通过日期检查的值:
Names Default To Here(1);
dt1 = New Table("Untitled",
Add Rows(6),
New Column("Column 1", Character, "Nominal", Set Values({"a", "a", "a", "b", "b", "b"})),
New Column("date", Numeric, "Continuous", Format("Best", 12), Set Values([2, 3, 4, 2, 3, 5]))
);
dt2 = New Table("Untitled 2",
Add Rows(2),
New Column("Column 1", Character, "Nominal", Set Values({"a", "b"})),
New Column("start", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1])),
New Column("end", Numeric, "Continuous", Format("Best", 12), Set Selected, Set Values([3, 6]))
);
dt3 = dt1 << Join(
With(dt2),
By Matching Columns(:Column 1 = :Column 1),
Drop multiples(0, 0),
Include Nonmatches(1, 0),
Preserve main table order(1)
);
dt3 << New Column("OK", Numeric, Nominal, << Set Each Value(:start < :date < :end));
dt3 << Select Where(:OK == 0);// << Delete Rows;