[英]How to join a table and get results based on date difference limited to 1 per match?
我整天都在搜寻并进行这项工作,但无法弄清楚。
我有一个表trades
,此查询涉及表上的3列: provider_id
, trade_id
, date_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_id
和date_close
上创建一个索引,如下所示:
ALTER TABLE `trades` ADD INDEX ( `provider_id` , `date_close` );
否则,一旦您的交易表增加到几十甚至数十万条记录,您的查询将极不可能终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.