Следующее значение по предыдущим данным

0

Я пытаюсь создать запрос, который будет запрашивать следующий результат, просматривая данные, как это было раньше.

Итак, мои данные похожи на

Train - Station   -  Time
158     Station1     11:10
158     Station1     11:11
158     Station1     11:12
158     Station1     11:13
158     Station1     11:14
158     Station2     11:25
158     Station2     11:26
158     Station2     11:27
158     Station3     11:41
158     Station3     11:42
158     Station3     11:43
158     Station3     11:44
158     Station3     11:45
158     Station4     11:50
158     Station4     11:51
158     Station4     11:52
158     Station4     11:53

Так что скажем im на "Station3"

Я использую следующий запрос, чтобы узнать, что такое предыдущая станция:

SELECT * FROM Train 
WHERE Train = '158' AND Station NOT LIKE 'Station3' 
ORDER BY Time DESC 
LIMIT 1

Я хочу спросить, что такое следующая станция, но я не могу понять, что сделать этот запрос. Какие-нибудь советы?

Изменить: Хорошо, скажем, что в моей таблице больше информации, о предыдущих поездках, и я хочу проверить, какая будет следующая станция.

Поезд - Станция - Время
158 Station1 10:10
158 Station1 10:11
158 Station1 10:12
158 Станция1 10:13
158 Station1 10:14
158 Station2 10:25
158 Station2 10:26
158 Station2 10:27
158 Station3 10:41
158 Station3 10:42
158 Станция3 10:43
158 Станция3 10:44
158 Station3 10:45
158 Station4 10:50
158 Station4 10:51
158 Station4 10:52
158 Station4 10:53
158 Station5 10:55
158 Station5 10:56
158 Station6 10:57
158 Station6 10:58
158 Station1 11:10
158 Станция1 11:11
158 Станция1 11:12
158 Станция1 11:13
158 Station1 11:14
158 Station2 11:25
158 Station2 11:26
158 Станция2 11:27
158 Station3 11:41
158 Station3 11:42
158 Станция3 11:43
158 Станция3 11:44
158 Station3 11:45
158 Station4 11:50
158 Station4 11:51
158 Station4 11:52
158 Station4 11:53
159 Station1 11:10
159 Station1 11:11
159 Station1 11:12
159 Станция1 11:13
159 Station1 11:14
159 Станция2 11:25
159 Station2 11:26
159 Station2 11:27
159 Station3 11:41
159 Station3 11:42
159 Станция3 11:43
159 Станция3 11:44
159 Station3 11:45
159 Station4 11:50
158 Station4 11:51
159 Station4 11:52
159 Station4 11:53



Так что скажем im на поезде 158 Station4 Time 11:53, и я не знаю, что следующая станция, и я хочу запросить, это Station5. Как я буду это делать?

  • 0
    Ваш запрос не даст вам предыдущую станцию надежно. С данными, он вернет Station4 11:53
Теги:

3 ответа

2

Другой подход без предварительного нахождения МАКСА (времени) для станции.

MySQL 8. 0+ облегчает получение данных следующей записи с помощью LEAD.

запрос

SELECT
   Table1.Train
 , Table1.next_station AS station
 , Table1.next_station_time AS time
FROM ( 

   SELECT 
     *
     , LEAD(Station) OVER (PARTITION BY Train ORDER BY Time) AS next_station
     , LEAD(Time) OVER (PARTITION BY Train ORDER BY Time) AS next_station_time
   FROM
    Table1
   WHERE
     Train = 158 
)
 AS Table1

WHERE
   Table1.station = 'station3'
 AND
   Table1.station <> Table1.next_station

см. демонстрацию https://www.db-fiddle.com/f/9Ld7XznMEuzNdRC3dmysUt/1

В более старых версиях MySQL нам нужно быть более креативными, потому что LEAD не поддерживается.
Лучший способ симулировать LEAD - использовать пользовательские переменные MySQL и сдвигать себя LEFT JOIN
Имейте в виду, что пользовательские переменные MySQL работают в MySQL 5. 1+

запрос

SELECT 
   current_train AS train
 , next_station AS station
 , next_time AS time
FROM ( 

  SELECT 
      t1.Train AS current_train
    , t1.Station AS current_station
    , t1.Time AS 'current_time'
    , t2.Train AS next_train
    , t2.Station AS next_station
    , t2.Time AS next_time
  FROM (
    SELECT 
      *
      , @rownum1 := @rownum1 + 1 AS rownum
    FROM 
      Table1
    CROSS JOIN ( SELECT @rownum1 := 0 ) AS i 
    WHERE
      Train = 158
    ORDER BY 
      Time ASC
  ) AS t1
  LEFT JOIN (
    SELECT 
      *
      , @rownum2 := @rownum2 + 1 AS rownum
    FROM 
      Table1
    CROSS JOIN ( SELECT @rownum2 := 0 ) AS i   
    WHERE
      Train = 158 
    ORDER BY 
      Time ASC 
  ) AS t2
  ON   
   t1.rownum + 1 = t2.rownum
 ) 
 AS records
WHERE
   records.current_station = 'station3'
 AND
   records.current_station <> records.next_station

Смотрите демо http://sqlfiddle.com/#!9/ff23fc/38

2

если вам нужно знать только следующую станцию, вы можете использовать подзапрос для максимального времени для станции3 и тренировки 158

  select * from 
  my_table 
  where time > ( 
  select max(time) max_time
  from my_table 
  where Train = '158' AND Station = 'Station3' )
  and train = '158'
  order by time limit 1 
0

Проще говоря, использование self join может помочь вам в этом.

Попробуй это:

select t1.* from train t1 
right join train t2 on t1.train=t2.train
where t1.station != 'Station3' and t1.time>(t2.time)
and t2.station='Station3' limit 1 ;

Попробуйте изменить значение station в таблице t1 и t2 на нужное значение, которое в этом случае является Station3.

Демо-версия Live SQL Fiddle здесь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню