-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 贸易 ID 1 转到了 2 个位置 100 和 101。贸易 ID 2 也转到了位置 101,总共 4000

好的,这个想法是一笔交易可以组成一个或多个头寸,一个头寸可以有很多笔交易。业务逻辑将确定交易流向的位置,因此我现在使用 A 和 B 作为标志,仅作为示例。

所以问题是..

当我从交易表中选择和汇总时,我将由各种交易组成的所有新头寸插入到头寸表中。现在创建映射表的最佳方法是什么。

我目前所做的是将新创建的职位 ID 存储在临时表中,然后重复我首先要生成职位的选择......并加入临时表。这似乎有很多重复的代码,我想知道做这种事情的最佳实践是什么。

最好的问候米克

4

2 回答 2

0

您应该使用 TableTradeID、PositionID 创建一个简单的表 TradePositionMapping。

然后根据你的业务逻辑:
(0.) Begin Transaction
1. 插入仓位
2. 获取 PositionID
3. 插入 TableTradeID,PositionID 对到 TradePositionMapping
(4.) Commit

应该就这么简单。

您可以在提交之前预先计算位置的总和以插入或更新它。

于 2012-11-07T09:38:57.597 回答
0

好的,经过更多研究,我采取的方法似乎是最好的方法。创建映射以将一个表中的源行连接到另一个表中的聚合行时,两种思想流派是

1 遍历源行并使用游标处理数据组。然后在 Destination 表中插入 1 条聚合记录,并在 Mapping 表中使用新 ID 构建 Mappings。然而,这对于游标来说可能很昂贵。

2 另一种方法和我采用的方法是从源表中提取和聚合数据,然后批量插入到目标表中,将新 ID 存储在临时表变量中。诀窍是确保您还复制您分组的标准,因为您需要将记录连接在一起以创建映射。

举个例子:

:Long 和 S 的短方向 :PK 是所有表中的标识列

:没有时间构建正确的代码,所以请原谅任何语法错误。

表交易 ——这是我们的源表



    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 戴尔 1000 S
    50 2012-11-01 戴尔 2000 S
    60 2012-11-01 戴尔 3000 S
    70 2012-11-01 惠普 5000 升
    80 2012-11-01 惠普 6000 升
    90 2012-11-01 惠普 7000 S
    100 2012-11-02 ORA 1000 S
    110 2012-11-02 欧拉 1000 S
    120 2012-11-02 欧拉 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 升
    200 IBM 5000 S
    300 戴尔 6000 S
    400 马力 11000 升
    500 马力 7000 秒

好的现在我们要使用用于聚合每个位置的记录来填写映射表

所以我们需要将交易加入职位,但我们需要使用我们用来分组的相同标准。这就是为什么我们需要将该标准插入到位置表中

所以这次我们选择所有交易但不求和并加入头寸表..然后将结果插入映射表。因此,这是通过在查询中构建 2 个派生表来完成的。1 个用于交易,另一个用于头寸,并根据最初用于对它们进行分组的标准将它们连接起来。我们从这两个查询中需要的只是 PK Id

-- 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 10 100 --IBM 1000 升
    2 20 100 --IBM 3000 升
    3 30 200 --IBM 5000 S
    4 40 300 --戴尔 1000 S
    5 50 300 --戴尔 2000 S
    6 60 300 --戴尔 3000 S
    7 70 400 --Hp 5000 升
    7 80 400 --Hp 6000 升
    7 90 500 --Hp 7000 S

因此,我们也可以将提要日期作为标准加入到临时表中,而不是加入到临时表中,但临时表也可以正常工作,因为我不希望在我的位置表中使用日期文件

所以现在我可以使用映射表查看哪些交易构成了哪些头寸。

我希望这可以帮助任何人查看批量插入和生成映射表。

问候米

于 2012-11-09T11:17:03.037 回答