ืืืฆื ืคืชืจื ื ืืช ืืขืืืช ืืืืืืช ืงืืืฆืืช ืฉื ืืฉืชืืฉืื ืืฉืืจืืช ืคืจืืืืคืืื ืืืืฆืขืืช Grafana.
ืืืฉืื ื ืจืฉื ื"ื ืจืื" ืื ืฆื. ืืืฉืื ืฉืื ืืช ืืกืืกืื ืฉืื ืื ืจืฉื ืขืื ืืื ืคืขืืื ืืืืื ืฉืืฉื ืืืืฉืื. ืืืฉืื ืืืื ืืกืฃ ืืงืืคื, ืืืืฉืื ืื ืืฉืืื ืืื ื
ืขื ืืขืจืื ื ืชืื ืื ืื ืืืืืื ืืื ืฉืื ื, ื ืืชืื ืืชื ืืืืชื ืฉื ืืฉืชืืฉ ืืืื ืืงืืืช ืืืงืจื-ืืืืืืช ืืื ืืกืจ ืืขื. ืืื ืืชืคืืก ืืจื ืืื ืืืขืืื ืขื ืงืืืฆืืช ืืืืืืช ืื ืืคืฉืจื ืืืืจืื. ืืื ืืืืืง ืื ืฉืื ืื ื ืขืืฉืื.
ืกืืืื
- ืืื ื ืืชืื ืขืืงืืืช ืืืืืข ืืื ื ืืืฅ?
- ืืืฆื ืืืฆืืจ ืงืืืฆืืช ืืคื ืืืืฉ ืฉื ืจืืฉืื ืืฉืชืืฉ ื-SQL.
- ืืื ืืืขืืืจ ืงืืืฆืืช ื
ืืจืคื ื .
ืื ืืชื ืืืจ ืืืืข ืื ืื ื ืืชืื ืขืืงืืืช ืืืืฆื ืืขืฉืืช ืืืช ื-SQL, ืืื ืืฉืืจืืช ืืกืขืืฃ ืืืืจืื.
1. ืืื ื ืืชืื ืขืืงืืืช ืืืืืข ืืื ื ืืืฅ?
ื ืืชืื ืขืืงืืืช ืืื ืฉืืื ืืืืืกืกืช ืขื ืืฉืืืื ืืื ืงืืืฆืืช (ืงืืืืจืืืช) ืฉืื ืืช ืฉื ืืฉืชืืฉืื. ืืจืื, ืืงืืืฆืืช ืฉืื ื ื ืืฆืจืืช ืืคื ืืฉืืืข ืื ืืืืืฉ ืฉืื ืืืฉืชืืฉ ืืชืืื ืืืฉืชืืฉ ืืฉืืจืืช. ืืืื ืืืืฉื ืืฉื ืืืืื ืฉื ืืืฉืชืืฉ, ืืืื ืืื ืืืงืืืจ ืฉืขื ืืกืืกื ื ืืชื ืืืฆืข ื ืืชืื ืืืจืื ืืืื. ืืืืืื, ืืื:
- ืืืฆื ืืฉืคืืข ืขืจืืฅ ืืจืืืฉื ืขื ืืื ืืืฉืชืืฉ;
- ืืืฆื ืืฉืืืืฉ ืืื ืชืืื ื ืื ืฉืืจืืช ืืฉืคืืข ืขื ืืืื;
- ืืืฆื ืืืฉืงื ืฉื ืชืืื ื X ืืฉืคืืขื ืขื ืืฉื ืืืืื ืืืฉืืืื ืืฉื ื ืฉืขืืจื.
2. ืืื ืขืืฉืื ืงืืืฆืืช ื-SQL?
ืืืื ืืืชืื ืืืฉืื ืืืฉืจ ืื ืืืคืฉืจืื ืื ื ืืืฆืื ืืื ืืช ืื ืชืื ืื ืืืืืชืืื ืฉืื ื - ืืืืืื ืฉื ืืืืืงืืช, ืกืืืืกืืืงื ืฉื ืฉื ื ืืืฆื: 1200 ืืฉืชืืฉืื ื-53 ืขืกืงืืืช. ืืื ืฉืชืืืื ืืฉืืง ืขื ืื ืชืื ืื ืืืื, ืืื ื ืชืืื ืช docker ืขื MySQL ื-Grafana ืื ืชืืืื ืืืืืช ืืื ืืขืฆืืื. ืงืืฉืืจ ื-GitHub ืืกืืฃ ืืืืืจ.
ืืืื ื ืจืื ืืช ืืฆืืจืช ืืงืืืฆืืช ืืืืฆืขืืช ืืืืื ืคืฉืืื.
ื ื ืื ืฉืืฉ ืื ื ืฉืืจืืช. ืืฉืชืืฉืื ื ืจืฉืืื ืฉื ืืืืฆืืืื ืืกืฃ ืขื ืฉืืจืืชืื. ืขื ืืืื, ืืฉืชืืฉืื ื ืืฉืจืื. ืื ื ืจืืฆืื ืืืืืช ืืื ืืื ืืืื ืืืฉืชืืฉืื, ืืืื ืืื ื ืืคืืื ืืืืจ ืืืืืฉ ืืจืืฉืื ืืืฉื ื ืฉื ืืฉืืืืฉ ืืฉืืจืืช.
ืืื ืืขื ืืช ืขื ืฉืืืืช ืืื, ืขืืื ื ืืื ืืช ืงืืืฆืืช ืขื ืกืื ืืืืฉ ืืจืืฉืื. ืื ื ื ืืืื ืคืขืืืืช ืืคื ืืืฆืืืช ืืื ืืืืฉ. ืืืงืื ืืืฆืืืช, ืขืฉืืืืช ืืืืืช ืืืื ืืช, ืืื ืื ืื ืื ืื ืคืขืืืืช ืืืจืช ืืืืืกืกืช ืขื ืืื.
ื ืชืื ืื ืืืืืืื
ืืืืืืืืช ื ืขืฉื ื-MySQL, ืื ืขืืืจ DBMSs ืืืจืื ืื ืืืืจืื ืืืืืช ืืืืืื ืืฉืืขืืชืืื.
ืืืืช ืืฉืชืืฉืื - ืืฉืชืืฉืื:
ืชืขืืืช ืืืืช ืฉื ืืืฉืชืืฉ
ืชืืจืื ืจืืฉืื
1
2019-01-01
2
2019-02-01
3
2019-02-10
4
2019-03-01
ืืืืช ืขืืืืืช - ืืืื:
ืชืขืืืช ืืืืช ืฉื ืืืฉืชืืฉ
ืชึทืึฒืจึดืื
ืกืืื
1
2019-01-02
11
1
2019-02-22
11
2
2019-02-12
12
3
2019-02-11
13
3
2019-03-11
13
4
2019-03-01
14
4
2019-03-02
14
ืืืจ ืืช ืื ืืืืงืืช ืืืฉืชืืฉ ืืชืืจืื ืืจืืฉืื:
SELECT
b.userId,
b.Date,
u.RegistrationDate
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
ืชืืฆืื:
ืชืขืืืช ืืืืช ืฉื ืืืฉืชืืฉ
ืชึทืึฒืจึดืื
ืชืืจืื ืจืืฉืื
1
2019-01-02
2019-01-02
1
2019-02-22
2019-01-02
2
2019-02-12
2019-02-01
3
2019-02-11
2019-02-10
3
2019-03-11
2019-02-10
4
2019-03-01
2019-03-01
4
2019-03-02
2019-03-01
ืื ื ืืื ืื ืงืืืฆืืช ืืคื ืืืืฉ; ืืฉื ืื, ืื ื ืืืืจืื ืืช ืื ืืชืืจืืืื ืืืืืฉืื:
DATE_FORMAT(Date, '%Y-%m')
ืขืืฉืื ืฆืจืื ืืืขืช ืืื ืืืืฉืื ืืืฉืชืืฉ ืืื ืคืขืื - ืื ืืืืื ืืื ืืืืฉ ืืืืื ืืืืืฉ ืืืจืฉืื. ื-MySQL ืืฉ ืคืื ืงืฆืื PERIOD_DIFF() - ืืืืื ืืื ืืืืฉืืื. ืืืกืฃ PERIOD_DIFF() ืืืงืฉื:
SELECT
b.userId,
DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
ืชืขืืืช ืืืืช ืฉื ืืืฉืชืืฉ
ืืืืฉ ืืืืื
ืชืืจืื ืจืืฉืื
MonthsDiff
1
2019-01
2019-01
0
1
2019-02
2019-01
1
2
2019-02
2019-02
0
3
2019-02
2019-02
0
3
2019-03
2019-02
1
4
2019-03
2019-03
0
4
2019-03
2019-03
0
ืื ื ืกืืคืจืื ืืช ืืืฉืชืืฉืื ืฉืืืคืขืื ืืื ืืืืฉ - ืื ื ืืงืืฆืื ืืช ืืจืฉืืืืช ืืคื ืืืืฉ ืืืื, ืืืืฉ ืืจืฉืื ืืฉืื ืื ืืืืฉื:
SELECT
COUNT(DISTINCT(b.userId)) AS UsersCount,
DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
GROUP BY BillingMonth, RegistrationMonth, MonthsDiff
ืชืืฆืื:
ืกืคืืจืช ืืฉืชืืฉืื
ืืืืฉ ืืืืื
ืืืืฉ ืืจืฉืื
MonthsDiff
1
2019-01
2019-01
0
1
2019-02
2019-01
1
2
2019-02
2019-02
0
1
2019-03
2019-02
1
1
2019-03
2019-03
0
ืืืืืฉืื ืื ืืืจ, ืคืืจืืืจ ืืืจืฅ, ืืืคืืข ืืฉืชืืฉ ืืืฉ ืืื ืื ืืื - MonthsDiff = 0. ืืฉืชืืฉ ืืื ืืื ืืืจ ืืื ืคืขืื ืืคืืจืืืจ - RegistrationMonth = 2019-01, BillingMonth = 2019-02, ืืืฉืชืืฉ ืืื ืืคืืจืืืจ ืืื ืคืขืื ืืืจืฅ.
ืืืืคื ืืืขื, ืืคืืกืื ื ืจืืื ืืื ืืืชืจ ืืืขืจื ื ืชืื ืื ืืืื.
ืืื ืืขืืืจืื ืงืืืฆืืช ืืืจืคืื ื
ืืืื ื ืืื ืืืฆืจืื ืงืืืฆืืช, ืืื ืืฉืืฉ ืืจืื ืจืฉืืืืช, ืืืจ ืื ืงื ืื ืชื ืืืชื. ื ืืชื ืืืืฆื ืจืฉืืืืช ืืืงืกื ืืืืฆืืจ ืืืืืืืช ืืคืืช, ืืื ืื ืื ืืฉืืื ืฉืื ื!
ื ืืชื ืืืฆืื ืงืืืฆืืช ืงืืืฆืืช ืืชืจืฉืื ืืื ืืจืืงืืืื ื
ืืฉื ืื, ืื ื ืืืกืืคืื ืฉืืืืชื ื ืืกืคืช ืืืืจืช ืื ืชืื ืื ืืคืืจืื ืืืชืืื ื-Grafana:
SELECT
DATE_ADD(CONCAT(s.RegistrationMonth, '-01'), INTERVAL s.MonthsDiff MONTH) AS time_sec,
SUM(s.Users) AS value,
s.RegistrationMonth AS metric
FROM (
## ััะฐััะน ะทะฐะฟัะพั, ะฒะพะทะฒัะฐัะฐััะธะน ะบะพะณะพััั
SELECT
COUNT(DISTINCT(b.userId)) AS Users,
DATE_FORMAT(b.Date, '%Y-%m') AS BillingMonth,
DATE_FORMAT(u.RegistrationDate, '%Y-%m') AS RegistrationMonth,
PERIOD_DIFF(DATE_FORMAT(b.Date, '%Y%m'), DATE_FORMAT(u.RegistrationDate, '%Y%m')) AS MonthsDiff
FROM billing AS b LEFT JOIN users AS u ON b.userId = u.userId
WHERE
u.RegistrationDate BETWEEN '2018-01-01' AND CURRENT_DATE
GROUP BY
BillingMonth, RegistrationMonth, MonthsDiff
) AS s
GROUP BY
time_sec, metric
ืืชืขืื ืืช ืื ืชืื ืื ืืืจืคื ื.
ืืจืฃ ืืืืืื ื
ืืืขืช ืขื ืืืืืื:
ืื ืชืจืฆื, ืชืืื ืืืขืื ืืช ืื ืชืื ืื ืฉืื ืืชืืื ื ืื.
ื .ื ืืืืจืื ืขื ื ืืชืื ืขืืงืืืช ื-SQL:
ืืงืืจ: www.habr.com