sql >> Databáze >  >> RDS >> Mysql

Funkce zpoždění / vedení MySQL?

To je lepší udělat na úrovni aplikace, ale jen pro zajímavost, zde je to na úrovni databáze:

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`

Všimněte si, že v MySQL nejsou žádné funkce lag/lead. Jediné, co můžete udělat, je používat proměnné. SELECT klauzule se zpracovává po jednom řádku. Takže můžete přiřadit hodnotu aktuálního řádku v posledních řádcích SELECT klauzuli a proto použijte tuto proměnnou jako hodnotu "předchozího řádku" v prvních řádcích SELECT klauzule.
Všimněte si také, že ORDER BY je velmi důležité. Tabulka není seřazená. Data v relačním DBMS nejsou tříděna, pokud neurčíte pořadí pomocí ORDER BY doložka.

  • Další informace o používání proměnných v dotazech si přečtěte zde

EDIT:

Změňte jej 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. Vyberte pouze poslední hodnotu pomocí group by na mysql

  2. Volání uloženého POSTUPU v Toad

  3. Schéma databáze Wufoo – Jak byste jej navrhli?

  4. Efektivní monitorování MySQL pomocí SCUMM Dashboards:Část první