SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.01.2010 16:24:31

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Математический обсчет средствами sql

Здравствуйте!

Подскажите плиз, кто в курсе, как можно наиболее эффективно средствами sql посчитать "количество переходов" значений в таблице через некоторое число.

На пример это будет выглядеть так:

Таблица
Data
1
9
8
3
7
8
1

Хотелось бы получить число "проходов" линии графика, построенного по данной выборке через 5 - то есть "переход" с 1 на 9, с 8 на 3, с 3 на 7 и с 8 на 1,
то есть число "4". Число строк в таблице достаточно велико, поэтому не хотелось бы делать полный select, сохранять его к себе в скрипт/программу и там уже обсчитывать.

Собственно вопрос - как это сделать средствами mysql? Имеет ли это вообще смысл? В какую сторону мне копнуть?

С уважением,
deadka


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 25.01.2010 16:31:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Математический обсчет средствами sql

Проще всего сделать так:
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

Неактивен

 

#3 25.01.2010 16:43:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Математический обсчет средствами sql

Доброго времени суток, 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

И, если не трудно, скажите на словах, что в ней происходит, я не очень понял sad, ведь @v присваивается NULL, что же потом попадает в y?

С уважением,
deadka


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 25.01.2010 17:01:57

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Математический обсчет средствами sql

Я допустил опечатку в запросе и к тому же он не работает. Работает вот такой запрос:
SET @v = NULL;
CREATE TABLE tbl2 SELECT @v y, @v:=x x FROM tbl ORDER BY id;

Он создает таблицу, в которой строками будут уже пары (прошлое значение под именем y и текущее значение под именем x).

Неактивен

 

#5 25.01.2010 17:55:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Математический обсчет средствами sql

Отличная мысль про (x-5)*(y-5)<0
Но можно упростить и обойтись без явного создания второй таблицы.

set @i=null;
select count(*) from (select @i y, @i:=`Data` x from `таблица`) t1 where (y-5)*(x-5)<0;

Неактивен

 

#6 25.01.2010 18:23:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Математический обсчет средствами sql

rgbeast, vasya - респект и огромная благодарность! Все работает как надо, оба варианта. Второй предпочтительней как раз из-за отсутствия необходимости делать еще одну таблицу.

Единственное, что хотелось бы уточнить - может быть имеет смысл (при условии, что все числа в таблице положительные) сделать "set @i=0;", а не "set @i=null;" ? А то ведь иначе на первом столбце внутренней выборки условие "where (y-5)*(x-5)<0" тоже в null превращается, а логичнее наверное было бы, чтобы условие where возвращало true/false? или здесь это не играет роли и null преобразуется в false?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 25.01.2010 18:41:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Математический обсчет средствами sql

null в варажении превращает все выражение в null, что означает false. Это сделано специально, чтобы на первом интервале не было подсчета (так как он не является интервалом). Если сделать 0, то если первое число больше 5, будет засчитана единичка.

Неактивен

 

#8 25.01.2010 18:44:07

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Математический обсчет средствами sql

Да, точно, я ошибся sad в предположении. Спасибо!!!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 24.02.2010 20:47:22

никадимыч
Участник
Зарегистрирован: 24.02.2010
Сообщений: 1

Re: Математический обсчет средствами sql

помогите нужно 5 основных формул по базе данных

Неактивен

 

#10 25.02.2010 00:42:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Математический обсчет средствами sql

Поясните, о чем идет речь. В такой формулировке совершенно неясно. Без иронии, никогда не слышал такого понятия как формула в отношении к базам данных.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson