У меня проблема с SELF JOIN в запросе MYSQL. Пожалуйста, проверьте таблицу и запросите

Пожалуйста, создайте таблицу по запросу ниже:

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

Стол :

У меня проблема с SELF JOIN в запросе MYSQL. Пожалуйста, проверьте таблицу и запросите

Вывод ошибки:

На этом изображении показаны повторяющиеся данные:

У меня проблема с SELF JOIN в запросе MYSQL. Пожалуйста, проверьте таблицу и запросите

Требуемый вывод:

Это изображение покажет требуемый результат:

У меня проблема с SELF JOIN в запросе MYSQL. Пожалуйста, проверьте таблицу и запросите

Описание :

Когда мы открываем сделку, она сохраняется в торговой таблице. После этого, когда мы закроем сделку, произойдет еще один вход с другим временем и объемом (если сделка закроется частично, объем будет другим, в противном случае закройте сделку полностью). Здесь первая запись будет OPEN_TIME, которая хранится как время, а вторая - CLOSE_TIME. Итак, как преобразовать две или более записей в одну с OPEN_TIME и CLOSE_TIME?

Я не понимаю, где вы рассчитываете этот столбец «Объем». Похоже, вам нужна GROUP BY с COUNT где-то там.

Sergio Tulentsev 10.09.2018 09:24
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Измените временное условие на:

--Редактировать

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 одинаков для более чем двух записей.

Sandeep Thakkar 10.09.2018 09:42

Пожалуйста, проверьте состояние сейчас

codeLover 10.09.2018 09:46

Еще раз спасибо за ответ. Но ее пропускают порядка 42580.

Sandeep Thakkar 10.09.2018 09:58

Можете ли вы один раз взглянуть на свои данные, потому что, если они работают для других двух заказов, они должны работать и для этого ...

codeLover 10.09.2018 10:03
Ответ принят как подходящий

Проверь это

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;

Другие вопросы по теме