Пожалуйста, создайте таблицу по запросу ниже:
CREATE TABLE `trade`
(
`order` VARCHAR(10) DEFAULT NULL,
`positionid` INT(11) DEFAULT NULL,
`time` DATETIME DEFAULT NULL,
`volume` FLOAT NOT NULL
)
engine=innodb
DEFAULT charset=latin1;
Вставить запрос
INSERT INTO `trade`
(`order`,
`positionid`,
`time`,
`volume`)
VALUES ('42556',
1111,
'2018-08-15 07:27:44',
2),
('42560',
1111,
'2018-08-18 08:32:47',
2),
('42564',
1235,
'2018-08-21 07:10:12',
5),
('42572',
1235,
'2018-08-23 17:20:26',
2),
('42580',
1235,
'2018-08-23 17:03:30',
3);
Я пробовал ниже запрос:
SELECT b.`order` AS `TICKET`,
b.`time` AS `OPEN_TIME`,
j.`time` AS `CLOSE_TIME`
FROM trade AS b
LEFT JOIN trade AS j
ON b.`positionid` = j.`positionid`
WHERE b.`time` != j.`time`;
Стол :
Вывод ошибки:
На этом изображении показаны повторяющиеся данные:
Требуемый вывод:
Это изображение покажет требуемый результат:
Описание :
Когда мы открываем сделку, она сохраняется в торговой таблице. После этого, когда мы закроем сделку, произойдет еще один вход с другим временем и объемом (если сделка закроется частично, объем будет другим, в противном случае закройте сделку полностью). Здесь первая запись будет OPEN_TIME, которая хранится как время, а вторая - CLOSE_TIME. Итак, как преобразовать две или более записей в одну с OPEN_TIME и CLOSE_TIME?
Измените временное условие на:
--Редактировать
where j.time = (select max(time) from test_query where positionid = j.positionid)
and b.time = (select min(time) from test_query where positionid = b.positionid)
так что экземпляр b
становится эквивалентным для открытия ордеров, а j
становится экземпляром для закрытия ордеров
Спасибо @codeLover за ответ. Но здесь это условие не работает для частично закрытых сделок. См. Требуемый вывод и фактическую таблицу, если positionid одинаков для более чем двух записей.
Пожалуйста, проверьте состояние сейчас
Еще раз спасибо за ответ. Но ее пропускают порядка 42580.
Можете ли вы один раз взглянуть на свои данные, потому что, если они работают для других двух заказов, они должны работать и для этого ...
Проверь это
SELECT j.`order` AS `TICKET`,
b.`positionid` AS `PositionID`,
b.`time` AS `OPEN_TIME`,
j.`time` AS `CLOSE_TIME` ,
j.`volume` AS `Volume`
FROM trade AS b
INNER JOIN trade AS j
ON b.`positionid` = j.`positionid`
where b.time = (select min(time) from trade as c1 where b.positionid=c1.positionid)
AND b.time!=j.time;
Я не понимаю, где вы рассчитываете этот столбец «Объем». Похоже, вам нужна GROUP BY с COUNT где-то там.