1

我整天都在四处寻找和研究这个,但就是想不通。

我有一个表trades,这个查询涉及表上的 3 列:provider_id, trade_id, date_close.

对于当天(指定提供商)的每一笔最终交易,我想获得前两天或更早结束的交易......并且是当天的最终收盘交易。例如,从此:

+-------------+----------+---------------------+
| 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")

我想LIMIT 1 DESCdate_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 |
+-----------+---------------------+-----------+---------------------+

关于我做错了什么的任何建议,或者我可以解决这个问题的更好方法?

4

1 回答 1

0

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

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` );

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

于 2013-04-03T18:26:27.543 回答