Kỹ thuật
Dùng REPEAT() tạo chuỗi '*', RPAD() căn lề, REVERSE() đảo chuỗi để vẽ histogram âm (bên trái) và dương (bên phải).
Ví dụ
Tạo bảng:
CREATE TABLE DemoTable632 (
histogramId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
histogramValue INT,
histogramImage TEXT
);
INSERT INTO DemoTable632(histogramValue) VALUES
(2), (3), (-6), (-5);
Truy vấn histogram:
SELECT histogramId, histogramValue,
CONCAT(
REVERSE(RPAD(REPEAT('*', IF(histogramValue < 0, -histogramValue, 0)), 100, ' ')),
REPEAT('*', IF(histogramValue < 0, 0, histogramValue))
) AS histogramImage
FROM DemoTable632
ORDER BY histogramId;
Kết quả:
+-------------+----------------+----------------+
| histogramId | histogramValue | histogramImage |
+-------------+----------------+----------------+
| 1 | 2 | ** |
| 2 | 3 | *** |
| 3 | -6 | ****** |
| 4 | -5 | ***** |
+-------------+----------------+----------------+
Giải thích logic
- Giá trị dương (≥0):
REPEAT('*', value)→ in * bên phải. - Giá trị âm (<0):
REPEAT('*', -value): Tạo chuỗi * cho giá trị tuyệt đối.RPAD(..., 100, ' '): Đệm space đến độ dài 100 (căn phải).REVERSE(...): Đảo chuỗi → * chuyển sang bên trái.
CONCATgộp phần âm (bên trái) + phần dương (bên phải).
Cải tiến: Căn giữa zero point
SELECT histogramId, histogramValue,
CONCAT(
REVERSE(RPAD(REPEAT('*', IF(histogramValue < 0, -histogramValue, 0)), 50, ' ')),
REPEAT(' ', 50 - IF(histogramValue > 0, histogramValue, 0)),
REPEAT('*', IF(histogramValue > 0, histogramValue, 0))
) AS histogramImage
FROM DemoTable632;
Ứng dụng
- Visualize dữ liệu trực tiếp trong SQL client (cli, terminal).
- Quick data profiling, anomaly detection.
- Reporting đơn giản không cần BI tool.