0

私は自分のデータをMicrosoftSQL2005データベースに保存するオンライン調査を開発しました。Rのデータに対して一連の外れ値チェックを作成しました。これらのスクリプトの一般的なワークフローは次のとおりです。

  1. sqlQuery()を使用してSQLデータベースからデータを読み取ります
  2. 外れ値分析を実行する
  3. sqlSave()を使用して、問題のある回答者を別のテーブルのデータベースに書き戻します。

私が書き戻しているテーブルの構造は次のとおりです。

CREATE TABLE outliers2(
    modelid int
    , password varchar(50)
    , reason varchar(50),
Constraint PK_outliers2 PRIMARY KEY(modelid, reason)
)
GO

ご覧のとおり、主キーをmodelidとreasonに設定しました。同じ回答者が複数のチェックの外れ値である可能性がありますが、どの回答者にも同じmodelidとreasonコンボを挿入したくありません。

まだデータを収集しているので、データに基づいて推定しているモデルを開発するときに、これらのスクリプトを毎日/毎週更新できるようにしたいと思います。sqlSave()これが私が使用しているコマンドの一般的な形式です:

sqlSave(db, db.insert, "outliers2", append = TRUE, fast = FALSE, rownames = FALSE)

ここdbで、は有効なODBC接続でdb.insertあり、次の形式になります。

> head(db.insert)
  modelid password          reason
1     873       abkd WRONG DIRECTION
2     875       ab9d WRONG DIRECTION
3     890       akdw WRONG DIRECTION
4     905       pqjd WRONG DIRECTION
5     941       ymne WRONG DIRECTION
6     944       okyt WRONG DIRECTION

sqlSave()主キーの制約に違反し、挿入の他のレコードを続行しない行を挿入しようとすると、チョークします。設定することでこの問題は軽減されると思いましたfast = FALSEが、そうではありません。

この問題を回避する方法について何かアイデアはありますか?drop最初のスクリプトの最初はいつでもテーブルを作成できましたが、それはかなり手間がかかるようで、間違いなく今後の問題につながるでしょう。

4

1 に答える 1

2

この場合、すべてが期待どおりに機能しています。すべてをバッチとしてアップロードすると、SQLServerはエラーが検出されるとすぐにバッチを停止します。残念ながら、私は優雅な組み込みソリューションを知りません。しかし、これをより効率的に処理するためのシステムをデータベースに構築することは可能だと思います。私はR内ではなくデータベースでデータの保存/管理を行うのが好きなので、私のソリューションはデータベースが非常に重いです。他の人はあなたにもっとR指向の解決策を提供するかもしれません。

まず、制約のない単純なテーブルを作成して、新しい行を保持し、それに応じてsqlSaveステートメントを調整します。これは、Rが情報をアップロードする場所です。

CREATE TABLE tblTemp(
    modelid int
    , password varchar(50)
    , reason varchar(50)
    , duplicate int()
)
GO

このテーブルに情報を入力するクエリでは、列「duplicate」に対して「No」を想定する必要があります。1 = Y&5=Nのパターンを使用します。外れ値であるものだけをマークすることもできますが、私は自分のロジックで明示的にすることを好む傾向があります。

また、outliers2のPKに違反するすべての行をダンプする場所も必要になります。

CREATE TABLE tblDuplicates(
    modelid int
    , password varchar(50)
    , reason varchar(50)
)
GO

わかった。ここで行う必要があるのは、新しい行をtblTempからoutliers2に移動するトリガーを作成することだけです。このトリガーは、重複するすべての行をtblDuplicatesに移動して、後で処理したり、削除したりします。

CREATE TRIGGER FindDups
ON tblOutliersTemp
AFTER INSERT
AS 

トリガー全体を調べて書くつもりはありません。テストするSQLServer2005がないので、構文エラーが発生する可能性があり、悪いコードを提供したくありませんが、トリガーが実行する必要があるのは次のとおりです。

  1. outliers2のPKに違反するtblTempのすべての行を特定します。重複が見つかった場合は、重複を1に変更します。これは、UPDATEステートメントを使用して実行されます。
  2. duplicate=1のすべての行をtblDuplicatesにコピーします。これは、INSERTINTOtblDuplicatesを使用して行います.....。
  3. 次に、手順2で使用したものとほぼ同じように見えるINSERT INTOステートメントを使用して、重複していない行をoutliers2にコピーします。
  4. tblTempからすべての行を削除して、次の更新バッチのためにそれをクリアします。このステップは重要です。

この方法で行うことの良い点は、PKに違反しているという理由だけで、sqlSave()がエラーにならず、明日のように後で一致に対処できることです。:-)

于 2010-11-12T14:18:18.990 に答える