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

Symuluj funkcję opóźnienia w MySQL

To mój ulubiony hack MySQL.

W ten sposób emulujesz funkcję opóźnienia:

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote przechowuje wartość cytatu z poprzedniego wiersza. Dla pierwszego wiersza @quot wynosi -1.
  • curr_quote przechowuje wartość cytatu z bieżącego wiersza.

Uwagi:

  1. order by klauzula jest tutaj ważna, tak jak w funkcji zwykłego okna.
  2. Możesz także użyć opóźnienia dla company żeby mieć pewność, że obliczasz różnicę w wycenach tej samej company .
  3. Możesz również zaimplementować liczniki wierszy w ten sam sposób @cnt:[email protected]+1

Zaletą tego schematu jest to, że jest on bardzo oszczędny obliczeniowo w porównaniu z niektórymi innymi podejściami, takimi jak używanie funkcji agregujących, procedur składowanych lub przetwarzanie danych na serwerze aplikacji.

EDYCJA:

Teraz przechodzę do pytania o uzyskanie wyniku we wspomnianym formacie:

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;

Zagnieżdżanie nie jest ze sobą powiązane, więc nie jest tak złe (obliczeniowo), jak wygląda (syntaktycznie) :)

Daj mi znać, jeśli potrzebujesz pomocy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak całkowicie usunąć MySQL 5.7 z systemu Windows?

  2. node.js async/await za pomocą MySQL

  3. dodaj kolumnę do tabeli mysql, jeśli nie istnieje

  4. Procedura składowana MySQL a funkcja, której powinienem użyć, kiedy?

  5. Napraw Odmowa dostępu dla użytkownika 'root'@'localhost' dla phpMyAdmin