Mysql Join 2表并选择日期范围之间的最大值和最小值
我有两张桌子,订单和价格。我想连接这两个表,并选择opentime和closetime之间的最大值和最小值 表1:订单 表2:费率 预期结果 我尝试此查询,但得到的结果为空Mysql Join 2表并选择日期范围之间的最大值和最小值,mysql,join,Mysql,Join,我有两张桌子,订单和价格。我想连接这两个表,并选择opentime和closetime之间的最大值和最小值 表1:订单 表2:费率 预期结果 我尝试此查询,但得到的结果为空 SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime,high,timehigh,low,timelow FROM (SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime FRO
SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime,high,timehigh,low,timelow FROM (SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime FROM `order` ORDER BY closetime DESC) table1
JOIN (SELECT MAX(price) as high,time as timehigh,pair as pairhigh FROM `rates` GROUP BY pair) table2 ON table1.pair=table2.pairhigh
JOIN (SELECT MIN(price) as low,time as timelow,pair as pairlow FROM `rates` GROUP BY pair) table3 ON table1.pair=table3.pairlow
WHERE table2.timehigh between table1.opentime and table1.closetime AND table3.timelow between table1.opentime and table1.closetime
尝试不带where子句的查询获取结果不为空但不应为空
SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime,high,timehigh,low,timelow FROM (SELECT id,type,pair,lot,opentime,openprice,closeprice,closetime FROM `order` ORDER BY closetime DESC) table1
JOIN (SELECT MAX(price) as high,time as timehigh,pair as pairhigh FROM `rates` GROUP BY pair) table2 ON table1.pair=table2.pairhigh
JOIN (SELECT MIN(price) as low,time as timelow,pair as pairlow FROM `rates` GROUP BY pair) table3 ON table1.pair=table3.pairlow
结果
如何解决这个问题?我相信这符合您的要求了吗
SELECT *
FROM Orders
JOIN (SELECT price as maxPrice, pair, tr_time as maxTime FROM Rates
JOIN (SELECT Rates.pair, MAX(Rates.price) AS price
FROM Rates, Orders
WHERE (Rates.tr_time between Orders.opentime and Orders.closetime)
GROUP BY Rates.pair)
as MaxPrices USING (price, pair)) maxRates USING (pair)
JOIN (SELECT price AS minPrice, pair, tr_time as minTime FROM Rates
JOIN (SELECT Rates.pair, MIN(Rates.price) AS price
FROM Rates, Orders
WHERE (Rates.tr_time between Orders.opentime and Orders.closetime)
GROUP BY Rates.pair)
as minPrices USING (price, pair)) minRates USING (pair);
您的代码结构太差,我无法真正了解到底发生了什么,但实际上,您似乎不知道聚合运算符(如MAX()
只返回一个值)
您还不清楚您想要的最低/最高价格是多少(我假设它是每对)
运行代码,看看它是否返回正确?如果不告诉我哪里不匹配,我可以开始修补它
编辑
新结果:
试试这个,它会按您的预期结果输出,可能对您有用;)
MySQL 5.6架构:
CREATE TABLE orders
(`id` int, `type` varchar(4), `pair` varchar(6), `lot` float, `opentime` datetime, `openprice` float, `closeprice` float, `closetime` datetime)
;
INSERT INTO orders
(`id`, `type`, `pair`, `lot`, `opentime`, `openprice`, `closeprice`, `closetime`)
VALUES
(1, 'buy', 'eurusd', 0.01, '2016-05-02 02:04:07', 1.15112, 1.14778, '2016-05-02 03:05:00'),
(2, 'sell', 'gbpusd', 0.01, '2016-05-02 02:24:17', 1.45221, 1.44989, '2016-05-02 03:05:00')
;
CREATE TABLE rates
(`id` int, `pair` varchar(6), `time` datetime, `price` float)
;
INSERT INTO rates
(`id`, `pair`, `time`, `price`)
VALUES
(10, 'eurusd', '2016-05-02 03:00:00', 1.14522),
(9, 'gbpusd', '2016-05-02 03:00:00', 1.44726),
(8, 'eurusd', '2016-05-02 02:30:00', 1.15258),
(7, 'gbpusd', '2016-05-02 02:30:00', 1.45311),
(6, 'eurusd', '2016-05-02 02:00:00', 1.15051),
(5, 'gbpusd', '2016-05-02 02:00:00', 1.45173),
(4, 'eurusd', '2016-05-01 01:30:00', 1.14258),
(3, 'gbpusd', '2016-05-02 01:30:00', 1.44326),
(2, 'eurusd', '2016-05-02 01:00:00', 1.15751),
(1, 'gbpusd', '2016-05-02 01:00:00', 1.45911)
;
SELECT DISTINCT
orders.*, mx.high, R1.time AS timehigh, mn.low, R2.time AS timelow
FROM orders
LEFT JOIN (
SELECT orders.pair, rates.time, max(rates.price) AS high
FROM orders
JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
group by orders.pair
) mx ON mx.pair = orders.pair
LEFT JOIN (
SELECT orders.pair, min(rates.price) AS low, rates.time
FROM orders
JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
GROUP BY orders.pair
) mn ON mn.pair = orders.pair
LEFT JOIN rates R1 ON mx.pair = R1.pair and R1.price = mx.high
LEFT JOIN rates R2 ON mn.pair = R2.pair and R2.price = mn.low
| id | type | pair | lot | opentime | openprice | closeprice | closetime | high | time | low | time |
|----|------|--------|------|-----------------------|-----------|------------|-----------------------|---------|-----------------------|---------|-----------------------|
| 1 | buy | eurusd | 0.01 | May, 02 2016 02:04:07 | 1.15112 | 1.14778 | May, 02 2016 03:05:00 | 1.15258 | May, 02 2016 02:30:00 | 1.14522 | May, 02 2016 03:00:00 |
| 2 | sell | gbpusd | 0.01 | May, 02 2016 02:24:17 | 1.45221 | 1.44989 | May, 02 2016 03:05:00 | 1.45311 | May, 02 2016 02:30:00 | 1.44726 | May, 02 2016 03:00:00 |
查询1:
CREATE TABLE orders
(`id` int, `type` varchar(4), `pair` varchar(6), `lot` float, `opentime` datetime, `openprice` float, `closeprice` float, `closetime` datetime)
;
INSERT INTO orders
(`id`, `type`, `pair`, `lot`, `opentime`, `openprice`, `closeprice`, `closetime`)
VALUES
(1, 'buy', 'eurusd', 0.01, '2016-05-02 02:04:07', 1.15112, 1.14778, '2016-05-02 03:05:00'),
(2, 'sell', 'gbpusd', 0.01, '2016-05-02 02:24:17', 1.45221, 1.44989, '2016-05-02 03:05:00')
;
CREATE TABLE rates
(`id` int, `pair` varchar(6), `time` datetime, `price` float)
;
INSERT INTO rates
(`id`, `pair`, `time`, `price`)
VALUES
(10, 'eurusd', '2016-05-02 03:00:00', 1.14522),
(9, 'gbpusd', '2016-05-02 03:00:00', 1.44726),
(8, 'eurusd', '2016-05-02 02:30:00', 1.15258),
(7, 'gbpusd', '2016-05-02 02:30:00', 1.45311),
(6, 'eurusd', '2016-05-02 02:00:00', 1.15051),
(5, 'gbpusd', '2016-05-02 02:00:00', 1.45173),
(4, 'eurusd', '2016-05-01 01:30:00', 1.14258),
(3, 'gbpusd', '2016-05-02 01:30:00', 1.44326),
(2, 'eurusd', '2016-05-02 01:00:00', 1.15751),
(1, 'gbpusd', '2016-05-02 01:00:00', 1.45911)
;
SELECT DISTINCT
orders.*, mx.high, R1.time AS timehigh, mn.low, R2.time AS timelow
FROM orders
LEFT JOIN (
SELECT orders.pair, rates.time, max(rates.price) AS high
FROM orders
JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
group by orders.pair
) mx ON mx.pair = orders.pair
LEFT JOIN (
SELECT orders.pair, min(rates.price) AS low, rates.time
FROM orders
JOIN rates ON orders.pair = rates.pair AND rates.time <= orders.closetime AND rates.time >= orders.opentime
GROUP BY orders.pair
) mn ON mn.pair = orders.pair
LEFT JOIN rates R1 ON mx.pair = R1.pair and R1.price = mx.high
LEFT JOIN rates R2 ON mn.pair = R2.pair and R2.price = mn.low
| id | type | pair | lot | opentime | openprice | closeprice | closetime | high | time | low | time |
|----|------|--------|------|-----------------------|-----------|------------|-----------------------|---------|-----------------------|---------|-----------------------|
| 1 | buy | eurusd | 0.01 | May, 02 2016 02:04:07 | 1.15112 | 1.14778 | May, 02 2016 03:05:00 | 1.15258 | May, 02 2016 02:30:00 | 1.14522 | May, 02 2016 03:00:00 |
| 2 | sell | gbpusd | 0.01 | May, 02 2016 02:24:17 | 1.45221 | 1.44989 | May, 02 2016 03:05:00 | 1.45311 | May, 02 2016 02:30:00 | 1.44726 | May, 02 2016 03:00:00 |
我想davidhood2已经搞定了,但以防万一
SELECT a.*
, b.price high
, b.time timehigh
, c.price low
, c.time timelow
FROM orders a
JOIN
( SELECT x.pair
, x.price
, x.time
FROM rates x
JOIN
( SELECT r.pair
, MAX(r.price) price
FROM rates r
JOIN orders o
ON o.pair = r.pair
AND r.time BETWEEN o.opentime AND o.closetime
GROUP
BY pair
) y
ON y.pair = x.pair
AND y.price = x.price
) b
ON b.pair = a.pair
JOIN
( SELECT x.pair
, x.price
, x.time
FROM rates x
JOIN
( SELECT r.pair
, MIN(r.price) price
FROM rates r
JOIN orders o
ON o.pair = r.pair
AND r.time BETWEEN o.opentime AND o.closetime
GROUP
BY pair
) y
ON y.pair = x.pair
AND y.price = x.price
) c
ON c.pair = a.pair;
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
| id | type | pair | lot | opentime | openprice | closeprice | closetime | high | timehigh | low | timelow |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
| 1 | buy | eurusd | 0.01 | 2016-05-02 02:04:07 | 1.15112 | 1.14778 | 2016-05-02 03:05:00 | 1.15258 | 2016-05-02 02:30:00 | 1.14522 | 2016-05-02 03:00:00 |
| 2 | sell | gbpusd | 0.01 | 2016-05-02 02:24:17 | 1.45221 | 1.44989 | 2016-05-02 03:05:00 | 1.45311 | 2016-05-02 02:30:00 | 1.44726 | 2016-05-02 03:00:00 |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
有sqlfiddle吗?没有sqlfiddle@strawberryOh多么不幸为什么不幸的@strawberryOh如果你提供了一些create/insert语句,这样人们就不必手动键入所有内容来调试了,这会更容易,不是1:30时的低点吗?这是行不通的。聚合结果中的非分组列是不确定的。考虑到所做的努力,否决票是苛刻的,但这个解决方案是错误的。正如对问题的描述,评级。时间
介于订单之间。开放时间
和订单之间。关闭时间
,不是吗?啊,也许是。然而,这仍然会产生一个不确定的结果。如果您确定我的错误,您可以在我的sql中指出它,并给我们一个正确的答案,为什么要投否决票?即使你有很高的声誉,或者你是MySQL的专家,你也不能否认这一点,也不能给我们一个正确的答案。这样做是不恰当的。谢谢你的否决票…@草莓你能给我们一个正确的答案吗?我相信我已经改正了。我还确信,您的预期结果中存在一个错误-对于英镑->美元,1.44726@0300不是营业时间间隔内的最低值,1.45311@0230更低?我已再次编辑。Change现在选择lowest,然后将其联接以获得正确的(确定的)时间,然后将其联接到显示开始/结束时间的开销表中—因为price是非键的。但是,如果您交叉连接,然后使用where语句来坚持价格和对字段中的相等性,这将起作用…请参阅代码更新(我知道聚合语句现在返回两个,但第二个字段是group by属性…)谢谢@davidhood,您的查询按预期工作。我几乎不做任何更改,因为GROUP BY Rates.pair不适用于同一对,具有同一对的所有订单只显示一个结果。而且你的查询速度很慢。。152行订单和12k行费率需要25分钟。你对如何让你的查询运行得更快有什么建议吗?哇,我不知道你的答案和我的答案有什么本质的区别…我只是把左连接率
从子查询中去掉了,真是谢天谢地的否决票@雷诺-我已经解释了本质上的区别。这不是左连接。这是你结果的不确定性。
SELECT a.*
, b.price high
, b.time timehigh
, c.price low
, c.time timelow
FROM orders a
JOIN
( SELECT x.pair
, x.price
, x.time
FROM rates x
JOIN
( SELECT r.pair
, MAX(r.price) price
FROM rates r
JOIN orders o
ON o.pair = r.pair
AND r.time BETWEEN o.opentime AND o.closetime
GROUP
BY pair
) y
ON y.pair = x.pair
AND y.price = x.price
) b
ON b.pair = a.pair
JOIN
( SELECT x.pair
, x.price
, x.time
FROM rates x
JOIN
( SELECT r.pair
, MIN(r.price) price
FROM rates r
JOIN orders o
ON o.pair = r.pair
AND r.time BETWEEN o.opentime AND o.closetime
GROUP
BY pair
) y
ON y.pair = x.pair
AND y.price = x.price
) c
ON c.pair = a.pair;
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
| id | type | pair | lot | opentime | openprice | closeprice | closetime | high | timehigh | low | timelow |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+
| 1 | buy | eurusd | 0.01 | 2016-05-02 02:04:07 | 1.15112 | 1.14778 | 2016-05-02 03:05:00 | 1.15258 | 2016-05-02 02:30:00 | 1.14522 | 2016-05-02 03:00:00 |
| 2 | sell | gbpusd | 0.01 | 2016-05-02 02:24:17 | 1.45221 | 1.44989 | 2016-05-02 03:05:00 | 1.45311 | 2016-05-02 02:30:00 | 1.44726 | 2016-05-02 03:00:00 |
+------+------+--------+------+---------------------+-----------+------------+---------------------+---------+---------------------+---------+---------------------+