Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak znaleźć poprzedni rekord [n-na-grupę max(sygnatura czasowa)

Ostatnie podejście ze zmiennymi jest rozsądne. Możesz także spróbować:

SELECT collect.*,
       (select max(timestamp)
        from data
        where data.channel_id = collect.channel_id AND data.timestamp < collect.timestamp
       ) AS prev_timestamp
FROM data AS collect 
WHERE collect.channel_id = 14 AND collect.timestamp >= 0 
ORDER BY collect.timestamp;

Ponadto utwórz indeksy na:zbieranie(id_kanału, znacznik czasu).

EDYCJA:

Następujące mogą być najszybsze:

  select d.*,
         if(@channel_id = channel_id, @prev_timestamp, NULL) as prev_timestamp,
         @channel_id := channel_id, @prev_timestamp = timestamp
  from data d cross join
       (select @channel_id := 0, @prev_timestamp := 0) vars
  where collect.channel_id = 14 AND collect.timestamp >= 0 
  order by channel_id, timestamp;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przesunięcie nieskończonych wierszy MySQL

  2. Najtańszy sposób na sprawdzenie, czy połączenie MySQL jest nadal aktywne

  3. Połączenie MySQL nie działa

  4. dlaczego mysql zmienia mój widok kodu?

  5. MySql pobiera listę unikalnych słów z tabeli, w której wartości w polu są oddzielone przecinkiem