2013-08-26 1 views
3

Ребята Я хочу использовать аналитическое отставание функции в mysql. В Oracle поддерживается, но я не могу это сделать в Mysql. Так может ли кто-нибудь помочь мне, как выполнить лаг-операцию в Mysql? НапримерКак сделать операцию задержки в mysql

UID      Operation 
1       Logged-in 
2       View content 
3       Review 

Я хочу использовать функцию задержки так, что мой результат будет следующим

UID      Operation    Lagoperation 
1       Logged-in     
2       View content   Logged-in 
3       Review     View content 

ли функция поддержки Mysql лаг ???

+1

Я думаю, что нет встроенной функции. Вам, вероятно, придется подключиться к той же таблице, чтобы получить такой эффект. Попробуйте что-нибудь из этой темы: http://stackoverflow.com/questions/5483319/how-do-i-lag-columns-in-mysql или http://stackoverflow.com/questions/11303532/simulate-lag-function- in-mysql –

+1

Нет, MySQL не поддерживает какие-либо современные функции SQL (функции окна, рекурсивные запросы, ...). Если это действительно важно для вас, вы можете рассмотреть возможность перехода на Postgres –

ответ

4

Вы можете эмулировать его с пользовательскими переменными:

select uid, operation, previous_operation from (
select 
y.* 
, @prev AS previous_Operation 
, @prev := Operation 
from 
your_table y 
, (select @prev:=NULL) vars 
order by uid 
) subquery_alias 
  • видеть, что работает в sqlfiddle живой

Здесь вы инициализировать переменную (ы). Это то же самое, что написать SET @prev:=NULL;, прежде чем писать свой запрос.

, (select @prev:=NULL) vars 

Тогда порядок этих операторов в пункте выбора имеет важное значение:

, @prev AS previous_Operation 
, @prev := Operation 

Первый раз отображает значение переменных, второй присваивает значение текущей строки к переменной.

Также важно иметь предложение ORDER BY, так как выход в противном случае не является детерминированным.

Все это помещается в подзапрос только из эстетических соображений, ... чтобы отфильтровать эту колонку

, @prev := Operation 

.

Смежные вопросы