-1

取引所での会社の取引のテーブルがあります。したがって、特定の日に、会社のために多くの取引を行うことができます。私は今、これらの取引を取り、それらをポジションにグループ化したいと考えています.

取引は、国、タイプなどの属性に応じて多くのポジションを下回ることができ、ポジションは多くの取引で構成できます。

だから私は次のテーブルを持っています

テーブルトレード

Id   Date      Company   Trade  Type
1 2012-11-01     IBM     1000    A
2 2012-11-01     IBM     3000    B
3 2012-11-01     Dell    1000    A
4 2012-11-01     HP      5000    A
5 2012-11-01     HP      6000    A
6 2012-11-01     HP      7000    B

テーブル TradePositionMapping

PK     TableTradeID      PositionID
1          1                100      --IBM 1000
2          1                101      --IBM 1000
3          2                101      --IBM 3000
4          3                102      --Dell 1000
5          4                103      --HP 5000
6          5                103      --HP 6000
7          4                104      --Hp 5000
7          5                104      --Hp 6000
7          6                104      --Hp 7000

テーブルの位置

PK   Company Position
100   IBM      1000
101   IBM      4000
102   Dell     1000
103   Hp      11000
104   Hp      18000

したがって、IBM Trade ID 1 の上の位置では、100 と 101 の 2 つの位置に移動しました。Trade Id 2 も位置 101 に移動し、合計で 4000 になりました。

わかりましたので、取引は 1 つ以上のポジションを構成でき、ポジションは多くの取引を持つことができるという考えです。ビジネス ロジックは、取引がどのポジションに流れるかを決定するため、ここでは例として、A と B をフラグとして使用しました。

それで、質問は..

取引テーブルから選択して集計するとき、さまざまな取引から構成されたすべての新しいポジションをポジション テーブルに挿入します。マッピングテーブルを作成する最良の方法は何ですか。

現時点で行っていることは、新しく作成された位置 ID を一時テーブルに保存し、最初に位置を生成するために行う選択を繰り返し、一時テーブルに結合することです。これはコードの重複が多いように思われます。そのようなことを行うためのベスト プラクティスが何であるかを知りたいと思います。

よろしくミック

4

2 に答える 2

0

TableTradeID、PositionIDを使用して単純なテーブルTradePositionMappingを作成する必要があります。

次に、ビジネスロジックに従って:
(0。)トランザクションの開始
1.位置の挿入
2.位置IDの取得
3. TableTradeID、PositionIDのペアをTradePositionMappingに挿入します
(4.)コミット

これほど単純なはずです。

コミットの直前に位置を挿入または更新する前に、位置の合計を計算できます。

于 2012-11-07T09:38:57.597 に答える
0

さて、さらに調査した結果、私が採用しているアプローチが最善のアプローチのようです。あるテーブルのソース行を別のテーブルの集約された行に結合するためのマッピングを作成するときの2つの考え方は、次のいずれかです。

1ソース行を繰り返し、カーソルを使用してデータのグループを処理します。次に、1つの集約レコードをDestinationテーブルに挿入し、新しいIDを使用してMappingテーブルのMappingをビルドします。ただし、これはカーソルを使用するとコストがかかる可能性があります。

2もう1つのアプローチと私が採用しているアプローチは、ソーステーブルからデータを取得して集約し、宛先テーブルに一括挿入して、新しいIDを一時テーブル変数に格納することです。秘訣は、マッピングを作成するためにレコードを結合するために必要なため、グループ化した基準も確実にコピーすることです。

例として:

:DirectionはLongの場合はL、shortの場合はSです:PKはすべてのテーブルのID列です

:適切なコードを作成する時間がなかったので、構文エラーを許してください。

テーブルトレード -これは私たちのソーステーブルです



    TradeId日付会社の取引方向
    10 2012-11-01 IBM 1000 L
    20 2012-11-01 IBM 3000 L
    30 2012-11-01 IBM 5000 S
    40 2012-11-01 Dell 1000 S
    50 2012-11-01 Dell 2000 S
    60 2012-11-01 Dell 3000 S
    70 2012-11-01 HP 5000 L
    80 2012-11-01 HP 6000 L
    90 2012-11-01 HP 7000 S
    100 2012-11-02 ORA 1000 S
    110 2012-11-02 ORA 1000 S
    120 2012-11-02 ORA 1000 S

したがって、すべての取引を選択し、会社と方向性に基づいてそれらを集約します

declare @feedDate DateTime = '2012-11-01'  -- feed date to run for
declare @newPositionIds Table (newPositionId bigint)  -- temp table to store new PositionId

-- Aggregate and insert the trades only for the feed date. ORA should not be processed
Insert into Position (Company, Direction, Position)
 Output inserted.PositionID         
  Into @newPositionIds (newPositionId)
select Company, Direction, sum(Trade)
  from Trade t where t.date = @feedDate 
    group by Company, Direction

これにより、これらのレコードがPositionsテーブルに追加されます。

テーブルの位置



    PositionID会社の位置の方向    
    100 IBM 4000 L
    200 IBM 5000 S
    300 Dell 6000 S
    400馬力11000L
    500馬力7000S

わかりました。次に、マッピングテーブルに、各位置を集計するために使用されたレコードを入力します。

したがって、トレードをポジションに参加させる必要がありますが、グループ化に使用したのと同じ基準を使用する必要があります。これが、その基準をポジションテーブルに挿入する必要がある理由です。

したがって、今回はすべてのトレードを選択しますが、それらを合計してポジションテーブルに結合しないでください。次に、結果をマッピングテーブルに挿入します。したがって、これはクエリで2つの派生テーブルを作成することによって行われます。1つはトレード用で、もう1つはポジション用であり、最初にそれらをグループ化するために使用される基準でそれらを結合します。これらの2つのクエリから必要なのは、PKIDだけです。

-- Select Trades for the feed date. ORA should not be included
Insert into TradePositionMapping(t.TradeID, p.PositionID)
(  select TradeId, Company, Direction, Trade            -- select the Trades
      from Trade t where t.date = @feedDate ) t
inner join
               -- join to temp table as we are only interested in the new ids we inserted
(select PositionId, Company,Direction from Position pos  
    inner join @newPositionIds npIds on pos.PositionId = npIds.newPositionIds
) p
on t.Company = p.Company and t.Direction = p.Direction

これにより、次のマッピングテーブルが得られます。

テーブルTradePositionMapping -TPM



    TPM_PK TradeID PositionID
    1 10100 --IBM 1000 L
    2 20100 --IBM 3000 L
    3 30200 --IBM 5000 S
    4 40300 --Dell 1000 S
    5 50300 --Dell 2000 S
    6 60300 --Dell 3000 S
    7 70400 --Hp 5000 L
    7 80400 --Hp 6000 L
    7 90500 --Hp 7000 S

したがって、ポジションテーブルに参加する代わりに、フィードの日付を基準として持ってきてそれに参加することもできますが、ポジションテーブルに日付ファイルが必要ないため、一時テーブルも正常に機能します。

これで、マッピングテーブルを使用して、どのトレードがどのポジションを構成しているかを確認できます。

これが、一括挿入を探してマッピングテーブルを生成するのに役立つことを願っています。

Mに関して

于 2012-11-09T11:17:03.037 に答える