Альтернативные алгоритмы для взгляда на agrep ( статья в Википедии о agrep), FASTA и BLAST биологические алгоритмы соответствия последовательности. Это особые случаи приблизительное сопоставление строк , также в Каменный алгоритм repositry Ручья. Если можно определить способы, которыми строки отличаются друг от друга, Вы могли бы, вероятно, сфокусироваться на адаптированном алгоритме. Например, aspell использует некоторый вариант "подобных звуку" (soundex-метафон) расстояние в сочетании с расстоянием "клавиатуры" для размещения плохих спеллеров и плохих печатающих устройств одинаково.
SELECT b.*,count(*) as total FROM bins b
left outer join table1 a on a.value between b.min_value and b.max_value
group by b.min_value
Ячейки таблицы содержат столбцы min_value и max_value, которые определяют ячейки. обратите внимание, что оператор «соединить ... на x МЕЖДУ y и z» является включительным.
table1 - это имя таблицы данных
Ответ Офри Равива очень близок, но неверен. Счетчик (*)
будет 1
, даже если есть нулевые результаты в интервале гистограммы. Запрос необходимо изменить, чтобы использовать условную сумму
:
SELECT b.*, SUM(a.value IS NOT NULL) AS total FROM bins b
LEFT JOIN a ON a.value BETWEEN b.min_value AND b.max_value
GROUP BY b.min_value;
Я создал процедуру, которую можно использовать для автоматического создания временной таблицы для ячеек в соответствии с указанным числом или размером для последующего использования с решением Офри Равива.
CREATE PROCEDURE makebins(numbins INT, binsize FLOAT) # binsize may be NULL for auto-size
BEGIN
SELECT FLOOR(MIN(colval)) INTO @binmin FROM yourtable;
SELECT CEIL(MAX(colval)) INTO @binmax FROM yourtable;
IF binsize IS NULL
THEN SET binsize = CEIL((@binmax-@binmin)/numbins); # CEIL here may prevent the potential creation a very small extra bin due to rounding errors, but no good where floats are needed.
END IF;
SET @currlim = @binmin;
WHILE @currlim + binsize < @binmax DO
INSERT INTO bins VALUES (@currlim, @currlim+binsize);
SET @currlim = @currlim + binsize;
END WHILE;
INSERT INTO bins VALUES (@currlim, @maxbin);
END;
DROP TABLE IF EXISTS bins; # be careful if you have a bins table of your own.
CREATE TEMPORARY TABLE bins (
minval INT, maxval INT, # or FLOAT, if needed
KEY (minval), KEY (maxval) );# keys could perhaps help if using a lot of bins; normally negligible
CALL makebins(20, NULL); # Using 20 bins of automatic size here.
SELECT bins.*, count(*) AS total FROM bins
LEFT JOIN yourtable ON yourtable.value BETWEEN bins.minval AND bins.maxval
GROUP BY bins.minval
Это сгенерирует счетчик гистограмм только для заполненных интервалов. Дэвид Уэст должен быть прав в своем исправлении, но по какой-то причине незаселенные корзины не появляются в результате для меня (несмотря на использование ЛЕВОГО СОЕДИНЕНИЯ - я не понимаю, почему).