Я в sql не сильно разбираюсь, написал такую хранимку. Хорошо бы ее сделать быстрее и эффективнее, если это возможно.

Есть числа в базе данных. Нужно рассчитать максимальную серию не выпадения.

Пример

Числа: 0 0 0 0 1 2 1 1 2 3 4 5 5 6 5 6 6 6 1

Макс серия не выпадения

0-15

1-10

2-10

3-9

4-10

5-11

6-13

Логика рассчета:

К примеру, 0 - мы видим что он выпадает 4 раза подряд, и после не выпадает - значит считаем количество с последнего выпадения нуля и до конца.

К примеру 4 - мы видим что количество до первого выпадения 4 больше, чем количество цифр после 4 - значит записываем первое количество.

Таблица:

id bigint

result int

date datetime

Используется mysql

Сама хранимка ниже.

И вопрос такой, где лучше считать, на стороне SQL или PHP. Важна скорость расчетов

DELIMITER $

CREATE DEFINER=`root`@`localhost` FUNCTION `CalculateStreakOfNonDropouts`(`number` INT, `beginDate` DATETIME, `endDate` DATETIME) RETURNS int(11)

BEGIN

DECLARE dates INT;

DECLARE currentIndex INT;

DECLARE nextIndex INT;

DECLARE maxSeries INT;

DECLARE tmpSeries INT;

DECLARE firstIteration INT;

SET firstIteration = 0;

SET tmpSeries = 0;

SET currentIndex = -1;

SET nextIndex = 0;

SET maxSeries = 0;

SET dates = (SELECT COUNT(`date`) FROM `rolls` WHERE `result`=number AND `date`>=(SELECT beginDate) AND `date`

IF dates=0 THEN

SET maxSeries = (SELECT COUNT(`result`) FROM `rolls` WHERE `date`>=(SELECT beginDate) AND `date`

ELSEIF dates=1 THEN

SET tmpSeries = (SELECT COUNT(`result`) FROM `rolls` WHERE `result`!=number and `date`>=(SELECT `date` FROM `rolls` WHERE `result`=number AND `date`>=(SELECT beginDate) AND `date`

SET maxSeries = (SELECT COUNT(`result`) FROM `rolls` WHERE `result`!=number and `date`=(SELECT beginDate) AND `date`=(SELECT beginDate));

IF tmpSeries>maxSeries THEN

SET maxSeries=tmpSeries;

END IF;

ELSE

loop_1: WHILE currentIndex

IF firstIteration=0 THEN

SET maxSeries=(SELECT COUNT(`result`) FROM `rolls` WHERE `result`!=number AND `date` BETWEEN (SELECT beginDate) AND (SELECT `date` FROM `rolls` WHERE `result`=number AND `date`>=(SELECT beginDate) AND `date`

SET firstIteration=1;

END IF;

SET currentIndex=currentIndex+1;

SET nextIndex=nextIndex+1;

IF nextIndex=dates THEN

set tmpSeries=(SELECT COUNT(`result`) FROM `rolls` WHERE `result`!=number AND `date` BETWEEN (SELECT `date` FROM `rolls` WHERE `result`=number AND `date`>=(SELECT beginDate) AND `date`

ELSE

SET tmpSeries=(SELECT COUNT(`result`) FROM `rolls` WHERE `result`!=number AND `date` BETWEEN (SELECT `date` FROM `rolls` WHERE `result`=number AND `date`>=(SELECT beginDate) AND `date`=(SELECT beginDate) AND `date`

END IF;

IF tmpSeries>maxSeries THEN

SET maxSeries=tmpSeries;

END IF;

END WHILE;

END IF;

RETURN maxSeries;

END$

DELIMITER ;

4 года назад
proghelp
23 года
4 года в сервисе
Был
4 года назад

Заявки фрилансеров

Александр
 
34 года
4 года в сервисе
Был
4 года назад
4 года назад
  • Похожие заказы

  • Требуется дополнить существующую программу на C# с использованием WinForms и SQL для отдела кадров. Необходимо добавить функционал изменения записей и другие функции, присущие отделу кадров. Основные операции уже реализованы: добавление, удаление и выборка данных.

    Базы данных1 заявка
    Закрыт
    4 года назад
  • $250

    Требуется разработать сервис выгрузки отчетов для системы олимпиад на Node.js и Vue.js. Реализовать фоновую выгрузку, чтобы пользователь мог продолжать работу во время обработки. Использовать Redis для фоновых процессов и веб-сокеты для уведомлений о готовности выгрузки. Необходимо также отрефакторить существующий метод выгрузки для улучшения читаемости и исправления багов.

    Базы данныхнет заявок
    Закрыт
    4 года назад
  • Требуется переписать запрос MySQL, использующий конструкцию ON DUPLICATE KEY UPDATE, для корректной работы в PostgreSQL. Необходимо учесть различия в синтаксисе и функционале между этими СУБД.

    Базы данныхнет заявок
    Закрыт
    4 года назад
  • Задача заключается в расчете максимальной серии не выпадения чисел в базе данных MySQL. Необходимо проанализировать данные из таблицы с полями id, result и date. Пример данных представлен для понимания проблемы. Рассмотрены различные серии и их максимальные значения.

    Базы данныхнет заявок
    Закрыт
    4 года назад
  • Необходимо разработать веб-приложение на Java или C#, связанное с базой данных MS SQL Server или Oracle. Приложение должно отображать таблицу Movies с возможностью фильтрации, а также позволять покупку игр и редактирование таблицы Orders через отдельный интерфейс. Подробное задание и SQL-файл для создания БД предоставлены.

    Базы данных1 заявка
    Закрыт
    4 года назад
  • Сеть стриптиз-клубов ищет PHP программиста на удаленную работу с зарплатой 1200-1400 USD. Требуется опыт в PHP, ООП, HTML, CSS и JavaScript, знание MySQL и навыки работы с фреймворком Laravel. График работы с 11:00 до 20:00 (Москва, Киев).

    Базы данных15 заявок
    Закрыт
    4 года назад
  • Необходим отчет из БД Firebird для печати каждой отгрузки бетона, включая несколько замесов по выбранному рецепту. Требуется использование IBExpert или Report Manager для формирования печатной формы. Пример живой БД доступен по запросу.

    Базы данных1 исполнитель
    Завершен
    4 года назад
  • $5

    Требуется спарсить каталог Авито и собрать урл всех разделов. Результат должен быть представлен в формате Excel с разбивкой по столбцам и строкам для удобной выборки урл из нужных категорий и разделов.

    Базы данных1 заявка
    Закрыт
    4 года назад
  • Требуется составить техническое задание для дополнительных модулей в существующей базе данных. Учитывайте кратчайшие сроки выполнения задачи. Ожидается четкое и полное описание требований к модулям.

    Базы данных1 заявка
    Закрыт
    4 года назад
  • Требуется разработать парсер Facebook с возможностью выгрузки данных в Excel-файл. Ожидается сбор информации о друзьях и подписчиках, включая ФИО, ссылки на профили, email, дату рождения, город и мобильный телефон. Также нужно учитывать лайки и комментарии под постами, а также посты с указанными тегами и хештегами.

    Базы данныхнет заявок
    Закрыт
    4 года назад