Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Подскажите плиз, кто в курсе, как можно наиболее эффективно средствами sql посчитать "количество переходов" значений в таблице через некоторое число.
На пример это будет выглядеть так:
Таблица
Data
1
9
8
3
7
8
1
Хотелось бы получить число "проходов" линии графика, построенного по данной выборке через 5 - то есть "переход" с 1 на 9, с 8 на 3, с 3 на 7 и с 8 на 1,
то есть число "4". Число строк в таблице достаточно велико, поэтому не хотелось бы делать полный select, сохранять его к себе в скрипт/программу и там уже обсчитывать.
Собственно вопрос - как это сделать средствами mysql? Имеет ли это вообще смысл? В какую сторону мне копнуть?
С уважением,
deadka
Неактивен
Проще всего сделать так:
1. пусть таблица tbl (id int, x int); id - номер строки, по которому упорядочена таблица, а x - числа
добавим поле y int, alter table tbl add y int;
2.
SET @v=NULL;
UPDATE tbl SET y=@v, @v=x ORDER BY id;
3. Далее SELECT count(*) from tbl WHERE (x-5)*(y-5)<0
Неактивен
Доброго времени суток, rgbeast!
Спасибо за оперативный ответ.
К сожалению, не работает инструкция "UPDATE tbl SET y=@v, @v=y ORDER BY id;"
mysql> SET @v=NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE tbl SET y=@v, @v=y ORDER BY id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@v=y ORDER BY id' at line 1
И, если не трудно, скажите на словах, что в ней происходит, я не очень понял , ведь @v присваивается NULL, что же потом попадает в y?
С уважением,
deadka
Неактивен
Я допустил опечатку в запросе и к тому же он не работает. Работает вот такой запрос:
SET @v = NULL;
CREATE TABLE tbl2 SELECT @v y, @v:=x x FROM tbl ORDER BY id;
Он создает таблицу, в которой строками будут уже пары (прошлое значение под именем y и текущее значение под именем x).
Неактивен
Отличная мысль про (x-5)*(y-5)<0
Но можно упростить и обойтись без явного создания второй таблицы.
Неактивен
rgbeast, vasya - респект и огромная благодарность! Все работает как надо, оба варианта. Второй предпочтительней как раз из-за отсутствия необходимости делать еще одну таблицу.
Единственное, что хотелось бы уточнить - может быть имеет смысл (при условии, что все числа в таблице положительные) сделать "set @i=0;", а не "set @i=null;" ? А то ведь иначе на первом столбце внутренней выборки условие "where (y-5)*(x-5)<0" тоже в null превращается, а логичнее наверное было бы, чтобы условие where возвращало true/false? или здесь это не играет роли и null преобразуется в false?
Неактивен
null в варажении превращает все выражение в null, что означает false. Это сделано специально, чтобы на первом интервале не было подсчета (так как он не является интервалом). Если сделать 0, то если первое число больше 5, будет засчитана единичка.
Неактивен
Да, точно, я ошибся в предположении. Спасибо!!!
Неактивен
помогите нужно 5 основных формул по базе данных
Неактивен
Поясните, о чем идет речь. В такой формулировке совершенно неясно. Без иронии, никогда не слышал такого понятия как формула в отношении к базам данных.
Неактивен