复杂SQL查询以查找两个表

时间:2015-12-15 12:10:36

标签: sql postgresql-9.4

我仍在处理与我问my previous question on Stack Overflow时相同的项目。我的SQL表在这个问题中有完整的描述,我会请你阅读本章以了解我的新问题。

现在的区别是两个表交易事件 不再同步:现在,时间并不准确两个表之间对应。但是,我知道两个表格之间仍存在一对一的对应关系,这意味着每笔交易都有相应的事件,但有些事件不对应交易

交易

  id |   time    |  price  | volume |   foo
-----+-----------+---------+--------+-------
 201 | 32400.524 |      53 |   2085 |   xxx
 202 | 32400.530 |      53 |   1162 |   xxx
 203 | 32400.531 |   52.99 |     50 |   xxx
 204 | 32401.532 |   52.91 |   3119 |   xxx
 205 | 32402.437 |   52.91 |   3119 |   xxx
 206 | 32402.832 |   52.91 |   3119 |   xxx
 207 | 32403.255 |   52.91 |   3119 |   xxx
 208 | 32404.242 |   52.92 |   3220 |   xxx
 209 | 32405.823 |   52.92 |   3220 |   xxx
 210 | 32406.839 |   52.92 |   3220 |   xxx

活动

   id |   time    |  price  | volume |  bar 
-----+-----------+---------+--------+------
 328 | 32399.345 |   52.91 |   3119 |  yyy
 329 | 32400.964 |   52.91 |   3119 |  yyy
 330 | 32401.194 |   52.91 |   3119 |  yyy
 331 | 32401.746 |   52.91 |   3119 |  yyy
 332 | 32401.823 |   52.91 |   3119 |  yyy
 333 | 32402.534 |   52.91 |   3119 |  yyy
 334 | 32402.876 |   52.92 |   3220 |  yyy
 335 | 32403.839 |   52.92 |   3220 |  yyy
 336 | 32404.634 |   52.92 |   3220 |  yyy
 337 | 32405.234 |   52.91 |   2501 |  yyy

我想要的是通过最小化交易和事件之间的时间差来表示两个表之间的对应关系。这是有道理的:如果有几个事件对应于数量和价格的交易,我们必须采取最少的事件"远在时间"来自贸易。

我试图做以下事情:

SELECT 
    t.*,
   (SELECT e.id
        FROM events o
        WHERE e.price = t.price
        AND e.volume = t.volume
        ORDER BY ABS(o.time - t.time)
        LIMIT 1
    ) as most_probable_corresponding_event_id
FROM trades t
ORDER BY t.time;

但问题是此查询没有给出唯一的对应:如果此事件距离两个交易点t1和t1最近,则可以为不同的交易t1和t2选择相同的事件e T2。我想要的是做一个独家的对应。

感谢您的帮助。

编辑:

我希望示例数据的输出为:

   trade_id | order_id |  price  | volume |  bar |   foo 
 -----------+----------+---------+--------+------+-------
      204   |   331    |   52.91 |   3119 |  xxx |   yyy
      205   |   333    |   52.91 |   3119 |  xxx |   yyy
      206   |   334    |   52.91 |   3119 |  xxx |   yyy
      207   |   335    |   52.92 |   3220 |  xxx |   yyy
      208   |   336    |   52.92 |   3220 |  xxx |   yyy
      209   |   337    |   52.92 |   3220 |  xxx |   yyy

2 个答案:

答案 0 :(得分:0)

我试图做很多但是无法得到你的结果。我得到了一些可能有帮助的东西。

使用以下查询,您将获得具有相同价格和数量的所有记录以及事件与交易之间的时差。

select *  from
(SELECT t.id as trade_id, e.id as event_id, e.price as price, e.volume as volume,e.bar as bar, t.foo as foo, abs(e.time-t.time) as diff 
FROM events e
inner JOIN trades t on t.price = e.price AND t.volume = e.volume order by trade_id,diff asc ) a

使用您的数据无法获得您期望的某些结果。即使用价格和数量的匹配,206不能拥有order_id 334。

我认为要克服大多数问题,需要更改数据库并添加外键(以便更容易进行连接)

以下查询会给你一个结果,但是event_id不匹配,要么是因为前面提到的问题(价格和数量匹配),要么是因为最接近时间匹配的事件记录不是你实际的那个想。

select *  from
(SELECT t.id as trade_id, e.id as event_id, e.price as price, e.volume as volume,e.bar as bar, t.foo as foo, abs(e.time-t.time) as diff FROM events e 
inner JOIN trades t on t.price = e.price AND t.volume = e.volume order by trade_id,diff asc ) a group by trade_id

答案 1 :(得分:0)

根据您在上一个问题中所写的内容以及示例数据,我希望时间总是晚于事件表而不是交易表。因此,如果添加事件时间>的条件订单时间,应该给你一个唯一的匹配,除非事件表明显落后于交易。

{{1}}