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

Funkcja opóźnień/leadów MySQL?

Lepiej to zrobić na poziomie aplikacji, ale dla zabawy, tutaj jest to na poziomie bazy danych:

select `user`, `start`, `stop`, diff from (
    select
    t.*
    , if(@prev_user = `user`, (`stop` - @prev) * -1, 0) as diff
    , @prev := `start`
    , @prev_user := `user`
    from
    t
    , (select @prev := null, @prev_user := null) var_init
    order by `user`, `start` desc
) sq
order by `user`, `start`

Zauważ, że w MySQL nie ma funkcji lagów/leadów. Wszystko, co możesz zrobić, to użyć zmiennych. SELECT klauzula jest przetwarzana po jednym wierszu na raz. Możesz więc przypisać wartość bieżącego wiersza w ostatnich wierszach SELECT klauzuli i dlatego użyj tej zmiennej jako wartości „poprzedniego wiersza” w pierwszych wierszach SELECT klauzula.
Zauważ również, że ORDER BY to bardzo ważne. Tabela nie jest posortowana. Dane w relacyjnym DBMS nie są sortowane, chyba że określisz kolejność za pomocą ORDER BY klauzula.

  • więcej informacji o używaniu zmiennych w zapytaniach tutaj

EDYCJA:

Zmień to na

UPDATE inactivitytmp
JOIN (
SELECT
inactivitytmp.*
, if(@prev_user_id = `user_id`, (`end_ts` - @prev) * -1, 0) as diff2
, @prev := `start_ts`
, @prev_user_id := `user_id`
FROM
inactivitytmp
, (SELECT @prev := null, @prev_user_id := null) var_init
ORDER BY `user_id`, `start_ts` DESC
) query_alias
ON inactivitytmp.user_id=query_alias.user_id AND inactivitytmp.start_ts=q uery_alias.start_ts AND inactivitytmp.end_ts=query_alias.end_ts
SET inactivitytmp.diff=query_alias.diff2;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zend_Db:Jak połączyć się z bazą danych MySQL przez tunel SSH?

  2. Czy tabele skrzyżowań powinny mieć więcej niż jeden klucz podstawowy z innej tabeli identyfikującej?

  3. Uzyskaj poprzednią wartość po aktualizacji - MySql

  4. Jak wykonać modelowanie dziedziczenia w relacyjnych bazach danych?

  5. MySQL Greatest N Results with Join Tables