пятница, 25 июня 2010 г.

Mysql графика - ASCII :)

 Все мы любим диаграмм и графики. Многие слышали о символьных графиках (техника walking-string) и даже успешно применяли её на практике.
Например так:
SELECT id,CONCAT(REPEAT('-',(val*10+1)-1),'#',REPEAT('-',22-(val*10+1))) AS bar
FROM sample_values
LIMIT 20
+----+------------------------+
| id | bar          |
+----+------------------------+
|  0 | ----------#----------- |
|  1 | -----------#---------- |
|  2 | ------------#--------- |
|  3 | -------------#-------- |
|  4 | --------------#------- |
|  5 | ---------------#------ |
|  6 | ----------------#----- |
|  7 | ----------------#----- |
|  8 | -----------------#---- |
|  9 | ------------------#--- |
| 10 | ------------------#--- |
| 11 | -------------------#-- |
| 12 | -------------------#-- |
| 13 | --------------------#- |
| 14 | --------------------#- |
| 15 | --------------------#- |
| 16 | --------------------#- |
| 17 | --------------------#- |
| 18 | --------------------#- |
| 19 | -------------------#-- |
| 20 | -------------------#-- |
+----+------------------------+
20 rows in set (0.00 sec)
 Как видно из примера, для продолжительных графиков( ограничение число отображаемых строк в терминале) хотелось бы иметь более привычный горизонтальный график ( горизонтальная ось - х) - это возможно и строится такой график с помощью техники string unwalking. (пример ниже)
mysql> SELECT * from characters;
+---+
| c |
+---+
| h |
| e |
| l |
| l |
| o |
+---+
5 rows in set (0.00 sec)

mysql> SELECT GROUP_CONCAT(c separator '') AS s FROM characters;
+-------+
| s     |
+-------+
| hello |
+-------+
1 row in set (0.00 sec)

  Идея:
  1. задать удобные  граничные условия удобные для отображение (фикс. длинна, кол-во строк и т.д.) 
  2. построить строку по методу показанному выше (техника walking-string)
  3. после построение, осуществить её поворот - транспонирование (техника string unwalking)
 SELECT
GROUP_CONCAT(SUBSTRING(bar,tinyint_asc.value,1) ORDER BY id SEPARATOR '') AS `Sinus graph`
FROM
tinyint_asc
INNER JOIN (
SELECT
id,
CONCAT(REPEAT('-',(val*10+1)-1),'#',REPEAT('-',22-(val*10+1))) AS bar
FROM
sample_values
LIMIT 50) sel_graph
WHERE
tinyint_asc.value BETWEEN 1 AND CHAR_LENGTH(bar)
GROUP BY
tinyint_asc.value
ORDER BY
tinyint_asc.value DESC;

+-----------------------------------------------------------------+
| Sinus graph                                                     |
+-----------------------------------------------------------------+
| ----------------------------------------------------------------|
| -------------######---------------------------------------------|
| -----------##------###------------------------------------------|
| ---------##-----------#-----------------------------------------|
| --------#--------------##---------------------------------------|
| ------##-----------------#--------------------------------------|
| -----#--------------------#-------------------------------------|
| ----#----------------------#------------------------------------|
| ---#------------------------#-----------------------------------|
| --#--------------------------#----------------------------------|
| -#----------------------------#---------------------------------|
| #------------------------------#-------------------------------#|
| --------------------------------#-----------------------------#-|
| ---------------------------------#---------------------------#--|
| ----------------------------------#-------------------------#---|
| -----------------------------------##----------------------#----|
| -------------------------------------#--------------------#-----|
| --------------------------------------#-----------------##------|
| ---------------------------------------#---------------#--------|
| ----------------------------------------##-----------##---------|
| ------------------------------------------##-------##-----------|
| --------------------------------------------#######-------------|
+-----------------------------------------------------------------+

Можно почитать: http://code.openark.org/blog/mysql/rotating-sql-graphs-horizontally

Комментариев нет: