繁体   English   中英

如何加入表格并根据日期差将结果限制为每次比赛1个?

[英]How to join a table and get results based on date difference limited to 1 per match?

我整天都在搜寻并进行这项工作,但无法弄清楚。

我有一个表trades ,此查询涉及表上的3列: provider_idtrade_iddate_close

对于当天(指定提供者)的每笔最终交易,我想获得先前在2天或更早之前关闭的交易,这是当天的最终交易。 例如,从此:

+-------------+----------+---------------------+
| provider_id | trade_id | date_close          |
+-------------+----------+---------------------+
|      126    |        1 | 2012-10-22 14:26:57 |
|      126    |        2 | 2012-10-22 14:31:59 |
|      126    |        3 | 2012-10-23 12:39:41 |
|      126    |        4 | 2012-10-24 07:29:57 |
|      126    |        5 | 2012-10-24 08:36:19 |
|      126    |        6 | 2012-10-24 08:47:23 |
|      126    |        7 | 2012-10-25 08:30:11 |
|      126    |        8 | 2012-10-25 08:34:21 |
|      126    |        9 | 2012-10-26 08:43:12 |
|      126    |       10 | 2012-10-26 14:29:35 |
+-------------+----------+---------------------+

所需的输出将是这样的:

+-----------+---------------------+-----------+---------------------+
| atrade_id | adate_close         | btrade_id | bdate_close         |
+-----------+---------------------+-----------+---------------------+
|         6 | 2012-10-24 08:47:23 |         2 | 2012-10-22 14:31:59 |
|         8 | 2012-10-25 08:34:21 |         3 | 2012-10-23 12:39:41 |
|        10 | 2012-10-26 14:29:35 |         6 | 2012-10-24 08:47:23 |
+-----------+---------------------+-----------+---------------------+

这是我到目前为止创建的查询:

SELECT a.trade_id atrade_id, MAX(a.date_close) adate_close, b.trade_id btrade_id, MAX(b.date_close) bdate_close
FROM trades a
INNER JOIN trades b ON a.provider_id = b.provider_id
WHERE TIMESTAMPDIFF(DAY, DATE_FORMAT(b.date_close, "%Y-%m-%d"), DATE_FORMAT(a.date_close, "%Y-%m-%d")) >= 2
AND a.provider_id = 126
GROUP BY DATE_FORMAT(a.date_close, "%Y-%m-%d")

我想在date_close列上设置LIMIT 1 DESC ,以便仅获得那几天的最终收盘date_close 但是无法弄清楚该如何做,所以我正在使用MAX() 我猜测肯定有更好的方法。 另外,虽然上面的查询使我关闭,但在所有结果上它都将btrade_id返回为1,并且atrade_id值也已关闭:

+-----------+---------------------+-----------+---------------------+
| atrade_id | adate_close         | btrade_id | bdate_close         |
+-----------+---------------------+-----------+---------------------+
|         4 | 2012-10-24 08:47:23 |         1 | 2012-10-22 14:31:59 |
|         7 | 2012-10-25 08:34:21 |         1 | 2012-10-23 12:39:41 |
|         9 | 2012-10-26 14:29:35 |         1 | 2012-10-24 08:47:23 |
+-----------+---------------------+-----------+---------------------+

关于我做错了什么的任何建议,或者我可以采用的更好方法?

我建议以下查询应提供所需的输出。 它使用两个嵌套的子查询来选择适当的平仓交易:

SELECT  PREV_CLOSE.atrade_id atrade_id,
        PREV_CLOSE.adate_close atrade_close,
        B2.trade_id btrade_id,
        B2.date_close bdate_close
FROM (
    SELECT  FINAL_CLOSE.provider_id,
            A.trade_id atrade_id, 
            A.date_close adate_close,
            MAX(B.date_close) prev_date_close
    FROM (
        SELECT  provider_id, MAX(date_close) final_date_close
        FROM    trades
        GROUP BY provider_id, DATE(date_close)
    ) FINAL_CLOSE
    JOIN        trades A ON A.provider_id = FINAL_CLOSE.provider_id AND A.date_close = FINAL_CLOSE.final_date_close
    LEFT JOIN   trades B ON B.provider_id = FINAL_CLOSE.provider_id AND B.date_close < DATE(FINAL_CLOSE.final_date_close) - INTERVAL 1 DAY
    GROUP BY FINAL_CLOSE.provider_id, A.trade_id
) PREV_CLOSE
JOIN    trades B2 ON B2.provider_id = PREV_CLOSE.provider_id AND B2.date_close = PREV_CLOSE.prev_date_close

由于我假设您的交易表可能很大,因此您肯定要在provider_iddate_close上创建一个索引,如下所示:

ALTER TABLE `trades` ADD INDEX ( `provider_id` , `date_close` );

否则,一旦您的交易表增加到几十甚至数十万条记录,您的查询将极不可能终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM