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

Simulujte funkci zpoždění v MySQL

Toto je můj oblíbený hack MySQL.

Takto emulujete funkci zpoždění:

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote obsahuje hodnotu nabídky předchozího řádku. Pro první řádek je @quot -1.
  • curr_quote obsahuje hodnotu aktuálního řádku.

Poznámky:

  1. order by klauzule je zde důležitá stejně jako ve funkci regularwindow.
  2. Pro company můžete také použít prodlevu jen pro jistotu, že počítáte rozdíl v uvozovkách stejné company .
  3. Stejným způsobem můžete také implementovat čítače řádků @cnt:[email protected]+1

Pěkná věc na tomto schématu je, že je výpočetně velmi nenáročný ve srovnání s některými jinými přístupy, jako je použití agregovaných funkcí, uložených procedur nebo zpracování dat na aplikačním serveru.

EDIT:

Nyní se dostáváme k vaší otázce získání výsledku ve formátu, který jste zmínili:

SET @quot=0,@latest=0,company='';
select B.* from (
select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
select time,company,[email protected] as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;

Vnoření spolu nesouvisí, takže není tak špatné (výpočetně), jak to vypadá (syntakticky) :)

Dejte mi vědět, pokud s tím potřebujete pomoc.



  1. Seznam Pythonu do pole PostgreSQL

  2. Jak mohu ukládat a získávat obrázky z databáze MySQL pomocí PHP?

  3. Vraťte seznam událostí spouštění serveru na serveru SQL Server

  4. Úvod do TimescaleDB