<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />およそ 1 週間ごとに変更が実装された日付と時刻を示す表があります。はるかに細かい時間 (分単位) を持つ別のデータ テーブルがあり、これを最初のテーブルに結合したいと考えています。同じ日付/時刻を持たない行に適切な変更レベルをリストするにはどうすればよいですか?
たとえば、表 1 では、変更レベル 1 が 3 月 1 日の午後 1 時に発生し、変更レベル 2 が 3 月 8 日の午前 6 時に発生するとリストできます。表 2 には、3 月 3 日午後 3 時 30 分のデータが含まれている可能性があります。 3 月 3 日午後 3 時 30 分をリストした表 2 の行にも変更レベル 1 がリストされるようにテーブルを結合したいと思います。
ありがとう!
Kennedy3 さん、こんにちは。
これを手動で行う方法を探している場合は、次のアプローチ (簡単にスクリプト化できます) が適しています。 以下の数式は、新しい「変更レベル」のタイムスタンプに突き当たるまで、「変更レベル」の値を新しい数式列にコピーします。
前提条件: 表 1 と表 2 の日付の列名は同じです。
以下の手順では、表 1 に「レベルの変更」という名前の列があります。
ステップ 1: [テーブル] => [連結] を使用して、一方のテーブルをもう一方のテーブルに追加します
ステップ 2: [テーブル] => [並べ替え] を使用して、新しいテーブルを日付で並べ替えます。
ステップ 3: 結果のテーブルに次の式を使用して式列を作成します。
(上記の数式では、新しい数式列を「列 3」と呼びます)
結果のテーブルにテーブル 1 の情報を保持したくない場合 (つまり、単なる「ルックアップ」テーブルの場合)、「レベルの変更」列から欠落していない行をすべて選択して削除できます。
お役に立てれば…
私は自宅のさまざまなセンサーを監視する際にも同様の問題に対処しました。 家中に 5 つのセンサーがあり、温度、湿度、照度を測定します。 値が前の値から変更されていない限り、測定値を 8 分ごとに中央ハブ (SmartThings) に送信します。 私は家の電力使用量を測定する連続電力計も持っています。
私がこの問題に対処した方法は、1 年間 5 分ごとのサンプルを含む「1 年あたり 5 分」の JMP データ テーブルを作成することです。 次に、スクリプトを使用して、20 個のセンサーからの値を今年の 5 分間のテーブルにインターリーブします。 したがって、センサーの特定のサンプルの読み取り値がある場合は記録されますが、ない場合は欠損値となります。
5 分の年:

私は別のスクリプトを使用して、「センサーの状態」 (基本的には「IsMissing」チェック) を視覚化します。 これにより、ネットワークの問題やセンサーの問題などが発生したときにそれを知ることができ、非常に役に立ちます。 また、結合が機能しているかどうかを視覚化します。

したがって、基本的な戦略は、測定で最も短い時間間隔 (分ごと) でマスター サンプリング テーブルを使用し、各センサーをそのマスター テーブルに結合することでした。
私はこれを「結合」ではなく「インターリーブ」と考えており、望ましい結果が複数あることは確かです。
あなたが望むものに近いと思われる古いコードをいくつか掘り出しました。 また、JSL の世界の中でも、目的地に到達するための良い方法とそうでない方法があります。 したがって、Eric のアプローチに代わるものとして、以下を参照してください。 もっと効率的にできるはずだと私は確信しており、他の人がそれに挑戦したいと思うかもしれません。 。 。
名前デフォルトここへ( 1 ) ;
// 2 つのテーブルに「日付」データを作成します
NF = 100 ;
ヴァルス= J ( NF 、 1 、ランダム整数(日付DMY ( 1 、 1 、 2014年) 、日付DMY ( 31 、 12 、 2014年))) ;
dtファイン=新しいテーブル( 「2014 年の日付と時刻 - 問題ありません」 、
新しい列( "日付" 、数値、継続的、
フォーマット( 「ddMonyyyy h:m:s」 、 22 、 0 ) 、
入力フォーマット( 「ddMonyyyy h:m:s」 、 0 ) 、
価値観(ヴァルス)
)
) ;
ノースカロライナ州= 10 ;
ヴァルス= J (ノースカロライナ州、 1 、ランダム整数(日付DMY ( 1 、 1 、 2014年) 、日付DMY ( 31 、 12 、 2014年))) ;
dt粗い=新しいテーブル( 「2014 年の日付と時刻 - 大まか」 、
新しい列( "日付" 、数値、継続的、
フォーマット( 「ddMonyyyy h:m:s」 、 22 、 0 ) 、
入力フォーマット( 「ddMonyyyy h:m:s」 、 0 ) 、
価値観(ヴァルス)
) 、
新しい列( "温度" 、数値、継続的、式(ランダム通常( 18 、 2 )))
) ;
dtファイン<<選別(による( :日付) 、注文(上昇) 、テーブルの置換) ;
dt粗い<<選別(による( :日付) 、注文(上昇) 、テーブルの置換) ;
// ************************************************ ************************************************* ****
// 粗いデータと細かいデータをインターリーブします
// ************************************************ ************************************************* ****
// dtCoarse から dtFine までの列を追加します
待って( 3 ) ;
n = Nコル( dtファイン) ;
コル= dt粗い<< getColumnNames ( "弦" ) ;
のために( c = 1 、 c <= Nアイテム(コル) 、 c ++、
dtype =カラム( dt粗い、コル[ c ]) << getDataType ;
mtype =カラム( dt粗い、コル[ c ]) << getModelingType ;
追加コル=エクスプレッション( dtファイン<<新しい列(コル[ c 】 、 dtype 、 mtype 、形式未定)) ;
代入(追加コル、エクスプレッション(形式未定) 、カラム( dt粗い、コル[ c ]) << getフォーマット) ;
追加コル;
) ;
// *********************************************** ************************************************* ****
// このロジックは、2 つのテーブルが昇順でソートされていることを前提としています。
// *********************************************** ************************************************* ****
ファインDT =カラム( dtファイン、 "日付" ) <<値の取得;
粗いDT =カラム( dt粗い、 "日付" ) <<値の取得;
もし(
// dtCoarse の時間は dtFine の最も早い時間よりも遅いため、後者の最初の行に値を挿入します
マックス(粗いDT ) <分(ファインDT ) 、
のために( c = 1 、 c <= Nアイテム(コル) 、 c ++、
カラム( dtファイン、 n + c )[ 1 】 =カラム( dt粗い、コル[ c ])[ Nロウ( dt粗い)] ;
) 、
// それ以外 。 。 。
// pos には、dtCoarse の値を挿入する必要がある dtFine の行の位置が含まれます。
// (注: pos の値が NRow(dtFine) より大きい場合、後者には行が追加されず、エラーも発生しません)。
位置=ロックソート済み(ファインDT 、粗いDT ) ;
位置=位置+ J ( Nロウ(位置) 、 1 、 1 ) ;
// セルに値を挿入します
のために( p = 1 、 p <= Nロウ(位置) 、 p ++、
のために( c = 1 、 c <= Nアイテム(コル) 、 c ++、
カラム( dtファイン、 n + c )[位置[ p ]] =カラム( dt粗い、コル[ c ])[ p 】 ;
) ;
) ;
) ;
やあ、ケネディ3、
これは、一定間隔でレベルが変化しても記録するのではなく、レベルの変化だけを記録するセンサーの場合によくある問題だと思うので、少し考えてみることにしました。これを行う方法を私が知っている唯一の方法は、大規模なテーブルに対して非常に非効率である可能性がある複合クエリを使用することです。あるいは、より効率的な可能性のあるバリエーションを考え出すことができるかもしれません。
ここに例を示します。私がカントリー クラブを経営しており、ゴルファーの数と気温の関係を調べているとします。気温データとして私が持っているのは、週間平均気温の表だけです。

ゴルファーの数については、ランダムな日に私のために働いている夏期学生がいて、彼女にゴルファーの数を数えてもらいました。彼女のデータは次のとおりです。

彼女がゴルファーを数えた日付は、平均高温測定値の日付と一致しないことに注意してください。彼女がゴルファーを数えた日付ごとに私がやりたいことは、その週の初めの気温の測定値を見つけることです。次の SQL を使用して、「Week <= TestDate」という条件で 2 つのテーブルを結合するとします。
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;
結果のテーブルは次のようになります。

ここからが難しい部分です。必要な結果を得るには、そのクエリをサブクエリとして使用し、他の 2 つのテーブルをそれに結合する必要があります。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
;
結果は、対応する週のゴルファーの数と平均気温を含むテーブルになります。

そこに到達するのは少し大変ですが、個人的にはそれ以外の方法を知りません。
お役に立てれば、
エリック