日付に基づいてSQLQueryから重複エントリを削除するこんにちは、
下記のリンク先のビデオを使用して SQLQuery 関数を使用しようとしましたが、問題が発生しています。
Community.jmp.com/t5/video/gallerypage/video-id/tvcW9lZTE6Ie3IFXxeru0AYNqvj5AB5r
問題: 「cylinder」、「Received_Date」、「lot」を含む表 2 を取得し、それを「batch」、「cylinder」、「Batch_Date」を含む表 1 にマージします。
「シリンダー」を正確に一致させてから、「バッチ日付」に最も近い「受信日」を取得する必要があります (Batch_Date >= Received_Date)。
クエリを作成し、理論的には各バッチに 1 つの一意のロット番号のみを提供する数値タグを作成する手順も実行しました (下の表には示されていません)。
しかし、これが私が得たものです
| バッチ | バッチ日付 | シリンダー番号 | ロット番号 | 受領日 |
| 1 | 2023年2月13日 | 55 | A | 2022年6月14日 |
| 1 | 2023年2月13日 | 55 | B | 2022年10月21日 |
| 1 | 2023年2月13日 | 55 | C | 2022年11月30日 |
クエリから取り込まれる行は 1 行のみであるはずです (2022 年 11 月 30 日の最終行である必要があります)。他の行は「バッチ 1」を 1 つだけ作成したため「ゴースト」です。
重複エントリを防ぎ、受信日がバッチ日付に最も近い場合にのみエントリを選択するように SQL コードを改善する方法について助言をいただけますか?
これはSQLQueryインターフェースから提供されたコードです
SELECT DISTINCT t1.Batch、t1.Batch_Date AS Date、t1.Cylinder_Number、
t2.Lot_Number、t2.Cylinder_Number AS "Cylinder_Number 2"、t2.Lot_Date AS "日付 2"、MIN(t2."Batch Num") AS "最小バッチ番号"
「表1」t1より
左外部結合「テーブル2」t2
ON ( ( t1.Cylinder_Number = t2.Cylinder_Number ) AND ( t1.Cat_Date >= t2.Lot_Date ) )
GROUP BY t1.Batch、t1.Batch_Date、t1.Cylinder_Number、
t2.ロット番号、t2.シリンダー番号、t2.ロット日付;
自動化とスクリプトRe: 日付に基づいて SQLQuery から重複エントリを削除するこれらは SQL クエリを実行している JMP テーブルですか? テーブルを共有できますか?
Re: 日付に基づいて SQLQuery から重複エントリを削除するここにファイルがあります。申し訳ありませんが、これらを添付するつもりでした。
表1-1と表2-2は上記の通りです。
クエリ結果には、各バッチに複数のエントリがある最終テーブルが表示されます (ただし、上記のように、バッチごとにエントリは 1 つだけである必要があります)。
Re: 日付に基づいて SQLQuery から重複エントリを削除するメインスレッドにファイルを添付して返信しました。ご連絡いただきありがとうございます。
Re: 日付に基づいて SQLQuery から重複エントリを削除するこれは、JMPの限られたSQL機能で私がやろうとしていることの限界にかなり近いです(少なくともデータテーブルを使用する場合)。SQL + JSLを使用する方がおそらく簡単です。
Names Default To Here(1);
res = New SQL Query(
Version(130),
Connection("JMP"),
JMP Tables(
["t1" => "$DOWNLOADS\Table1-1.jmp",
"t2" => "$DOWNLOADS\Table 2-2.jmp"]
),
QueryName("SQLQuery2"),
CustomSQL(
"\[SELECT
t1.Cylinder,
t1.Batch,
t1."Batch Date",
t2."Received Date",
t2.Supplier,
t2.Lot
FROM t1
LEFT OUTER JOIN t2 ON
t1.Cylinder = t2.Cylinder
AND t1."Batch Date" >= t2."Received Date"
]\")
) << Run;
res << select where(Row() == Col Max(Row(), :Cylinder, :Batch) | Is Missing(:Lot));
res << Invert Row Selection;
res << delete rows;Re: 日付に基づいて SQLQuery から重複エントリを削除するこんにちは。迅速なご支援をありがとうございます。マクロを試してみましたが、残念ながら一部の項目については可能な限り古い日付が保持されています。ただし、すべてのエントリに対してこれが行われているわけではないようです (以下の表の最後の行を参照)。
したがって、同じバッチに複数の行が存在しないことは確実に改善されていますが、問題のバッチの正しいロット/受領日が一貫して取得されているわけではありません。
例
| シリンダー | バッチ | バッチ日付 | 受領日 | サプライヤー | 多く | | 受領予定日 |
| 8 | 2273 | 2023年8月9日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 3 | 2274 | 2023年8月10日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 2 | 2275 | 2023年8月11日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 10 | 2276 | 2023年8月12日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 6 | 2277 | 2023年8月12日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 9 | 2278 | 2023年8月13日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 1 | 2279 | 2023年8月14日 | 2022年5月20日 | B | 55 | | 2023年6月22日 |
| 212 | 2280 | 2023年8月15日 | 2023年6月22日 | B | 74 | | (ファイルは正しいです) |
Re: 日付に基づいて SQLQuery から重複エントリを削除する表の読み方がよくわかりません。表2-2を見ると、シリンダー1の受信日が2022年5月20日の行が1行しかありません。

Re: 日付に基づいて SQLQuery から重複エントリを削除するこんにちは。トピックをアクティブに保つために返信します。独自の情報を削除するためにファイルを更新したときに何かが起こったと思います。明日さらに調べて、返信します。
Re: 日付に基づいて SQLQuery から重複エントリを削除するご支援ありがとうございます。元のデータ セットにエラーがあることに気付きました (この Web サイトに入力するためにデータを匿名化するために修正しました)。このコードは正常に動作しています。他にご質問があればご連絡ください。Re: 日付に基づいて SQLQuery から重複エントリを削除する最後の質問です。一致基準として使用していない場合でも、テーブル 2 から引き出された列を最終クエリ テーブルに追加するにはどうすればよいでしょうか。
上記のコードに t2."wt%" 列を追加しようとしましたが、コードでエラーが発生します。同時に取得したい他の列 (合計約 10 列) がありますが、エラーなしでこれを行う方法がわかりません。
ありがとう!
Re: 日付に基づいて SQLQuery から重複エントリを削除するどのようなエラーが発生していますか?
これらはカスタム SQL() 部分内に配置する必要があります (試してみたところ、t2."wt%" で問題なく動作しました)
CustomSQL(
"\[SELECT
t1.Cylinder,
t1.Batch,
t1."Batch Date",
t2."Received Date",
t2.Supplier,
t2.Lot,
t2."wt%"
FROM t1
LEFT OUTER JOIN t2 ON
t1.Cylinder = t2.Cylinder
AND t1."Batch Date" >= t2."Received Date"
]\")
t2 のすべての列が必要な場合は、JMP が使用している SQL が t2 をサポートしていると思います。*