แ แแแแ แแแแแแฌแงแแแขแแ แแ แแแแแฃแแขแแก แกแแ แแแกแจแ แแแแฎแแแ แแแแแแ แแแฐแแ แขแแแแก แแแแฃแแแแแแชแแแก แแ แแแแแแ Grafana-แก แแแแแงแแแแแแ.
แแแฆแแชแแ แฎแแแ แแแแฌแแ แ แแ แกแแแฃแแแแแ "แฉแแแซแแแ". แแแฆแแชแแ แแแแแแฌแงแแ แแแ แแแ แแ แแแแแ แ แแแแแแแแแฏแแ แแแ แแแแกแขแ แแ แแ แแฅแแกแ แแแแก แแแแแแแแแแแจแ. แแแฆแแชแแก แคแฃแแ แแแแฅแแก แกแแแแ แแจแ, แแแฆแแช แแ แฃแกแแกแงแแแแแ แแแแแแ
แแกแแ แแแ แแแแแชแแแแ แแแแ แแแแแแ, แ แแแแ แแช แฉแแแแแ, แแแแแแแแฃแแแฃแ แ แแแแฎแแแ แแแแแก แฅแชแแแแก แแแแแแแ แแ แแแแ แ-แแแแแฌแงแแแขแแแแแแก แแแฆแแแ แฃแแแ แแ. แแแแ แแ แขแแแแแแชแแแแแก แแแญแแ แ แแ แแแ แฏแแฃแคแแแแแ แแฃแจแแแแ แจแแกแแซแแแแแแแ แแ แแฃแชแแแแแแแแ. แ แแกแแช แฉแแแ แแแแแแแแ แแฃแกแขแแ.
แ แแแแฃแแ
- แ แ แแ แแก แแแฐแแ แขแแก แแแแแแแ แแ แ แแขแแ แแ แแก แกแแญแแ แ?
- แ แแแแ แจแแแฅแแแแ แแแฐแแ แขแแแ SQL-แจแ แแแแฎแแแ แแแแแก แ แแแแกแขแ แแชแแแก แแแแก แแแฎแแแแแ.
- แ แแแแ แแแแแแแขแแแแ แแแฐแแ แขแแแ
แแ แแคแแแ .
แแฃ แฃแแแ แแชแแ แ แ แแ แแก แแแฐแแ แขแแก แแแแแแแ แแ แ แแแแ แแแแแแแแ แแก SQL-แจแ, แแแแแแแ แแแ แแแแแ แแแแ แแแแงแแคแแแแแแแ.
1. แ แ แแ แแก แแแฐแแ แขแแก แแแแแแแ แแ แ แแขแแ แแ แแก แกแแญแแ แ?
แแแฐแแ แขแแก แแแแแแแ แแ แแก แแแแแแ, แ แแแแแแช แแแคแฃแซแแแแฃแแแ แแแแฎแแแ แแแแแแ แกแฎแแแแแกแฎแแ แฏแแฃแคแแก (แแแฐแแ แขแแแแก) แจแแแแ แแแแแ. แงแแแแแแ แฎแจแแ แแ, แฉแแแแ แฏแแฃแคแแแ แแฅแแแแแ แแ แแแแ แแก แแ แแแแก แแแฎแแแแแ, แ แแแแกแแช แแแแฎแแแ แแแแแแ แแแแฌแงแ แกแแ แแแกแแก แแแแแงแแแแแ. แแฅแแแแ แแแแแแแแแแแ แแแแฎแแแ แแแแแก แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแ แแ แแก แแ แแก แแแแแแแขแแ แ, แ แแแแแก แกแแคแฃแซแแแแแแช แจแแแซแแแแ แฉแแขแแ แแแก แกแแแแแแ แ แแฃแแ แแแแแแแ. แแแแแแแแแ, แแแแแ:
- แ แแแแ แแแฅแแแแแแก แจแแซแแแแก แแ แฎแ แแแแฎแแแ แแแแแก แกแแชแแชแฎแแแแ;
- แ แแแแ แแแฅแแแแแแก แแแแแกแแแแ แ แคแฃแแฅแชแแแก แแ แกแแ แแแกแแก แแแแแงแแแแแ แกแแชแแชแฎแแแก แฎแแแแ แซแแแแแแแแ;
- แ แแแแ แแแแฅแแแแ X แคแฃแแฅแชแแแก แแแจแแแแแ แกแแชแแชแฎแแแแ แแแกแฃแ แฌแแแแแ แจแแแแ แแแแ.
2. แ แแแแ แจแแแฅแแแแ แแแฐแแ แขแแแ SQL-แจแ?
แกแขแแขแแแก แแแแ แแ แกแแฆแ แแแ แ แแ แแแแซแแแแก แกแแจแฃแแแแแแก แฌแแ แแแแแแแแแแ แฉแแแแ แ แแแแฃแ แ แแแแแชแแแแแ แแฅ - แกแแขแแกแขแ แแแแแแกแแงแ แแแแ, แกแขแแขแแกแขแแแ แฌแแแแฌแแแแแฎแแแ แแก แแแแแแแแแแแจแ: 1200 แแแแฎแแแ แแแแแ แแ 53 แขแ แแแแแฅแชแแ. แแแแกแแแแแก, แ แแ แแ แแแแแชแแแแแแ แแแแแจแ แจแแแแซแแแ, แฉแแแ แแแแแแแแแแ แแแแแ แแก แกแฃแ แแแ MySQL-แแ แแ Grafana-แแ, แ แแแแแจแแช แแฅแแแ แแแแแ แจแแแแซแแแแ แแแแแชแแแแ แแก แงแแแแแคแแ แ. แแแฃแแ GitHub-แแ แกแขแแขแแแก แแแแแก.
แแ แแฅ แฉแแแ แแแฉแแแแแแ แแแฐแแ แขแแแแก แจแแฅแแแแก แแแแแ แขแแแแแฃแแ แแแแแแแแแก แแแแแงแแแแแแ.
แแแแฃแจแแแ, แแแแฅแแก แกแแ แแแกแ. แแแแฎแแแ แแแแแแ แแแ แแแแกแขแ แแ แแแแแแ แแฅ แแ แฎแแ แฏแแแแ แคแฃแแก แกแแ แแแกแแแแ. แแ แแแ แแแแแแแแแแแจแ แแแแฎแแแ แแแแแแ แขแแแแแแ แแแแก. แแแแแแ แแแแแ แแแแแ แ แแแแแ แฎแแแก แชแฎแแแ แแแแ แแแแฎแแแ แแแแแแ แแ แ แแแแแแ แแแแแแแ แแจแแแแ แกแแ แแแกแแ แกแแ แแแแแแแแก 1-แแ แแ แแ-2 แแแแก แจแแแแแ.
แแ แแแแฎแแแแแ แแแกแฃแฎแแก แแแกแแชแแแแ, แฉแแแ แฃแแแ แแแแจแแแแ แแแฐแแ แขแแแ แ แแแแกแขแ แแชแแแก แแแแก แแแฎแแแแแ. แฉแแแ แแแแแแแแแ แแฅแขแแแแแแก แฎแแ แฏแแแแก แแแฎแแแแแ แงแแแแ แแแแจแ. แฎแแ แฏแแแแก แแแชแแแแ, แจแแแซแแแแ แแงแแก แจแแแแแแแแ, แแแแแฌแแ แแก แแแแแกแแฎแแแ แแ แแ แแแ แแแคแฃแซแแแแฃแแ แกแฎแแ แแฅแขแแแแแ.
Raw แแแแแชแแแแแ
แแแแแแแแแแ แแแแแแแ MySQL-แจแ, แแแแ แแ แกแฎแแ DBMS-แแแแกแแแแก แแแแจแแแแแแแแแ แแแแกแฎแแแแแแแแ แแ แฃแแแ แแงแแก.
แแแแฎแแแ แแแแแแ แชแฎแ แแแ - แแแแฎแแแ แแแแแแ:
แแแแฎแแแ แแแแแก แแแแแขแแคแแแแชแแ
แฒ แแแแกแขแ แแชแแแก แแแ แแฆแ
1
2019-01-01
2
2019-02-01
3
2019-02-10
4
2019-03-01
แฆแแ แแแฃแแแแแก แชแฎแ แแแ - แแแแแแแ:
แแแแฎแแแ แแแแแก แแแแแขแแคแแแแชแแ
แแแ แแฆแ
Sum
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
แฉแแแ แแแแแแแ แงแแแแ แแแแจแ แแแแฅแขแแฃแ แแแฃแ แแแแฎแแแ แแแแแแก - แแแฏแแฃแคแแแ แฉแแแแฌแแ แแแก BillingMonth, RegistrationMonth แแ MonthsDiff แแแฎแแแแแ:
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, แฎแแแ แแแแแ แแแแก แแ แแ แแแแฎแแแ แแแแแ แแฅแขแแฃแ แ แแงแ แแแ แขแจแ.
แแฃแแแแ แแแแ, แแแแฃแจแแแ แฃแแแ แฉแแแก แแแแแชแแแแ แแแ แแแแ แแแจแ.
แ แแแแ แแแแแแแขแแแแ แแแฐแแ แขแแแ แแ แแคแแแแจแ
แฉแแแ แแแกแฌแแแแแ แแแฐแแ แขแแแแก แคแแ แแแ แแแ, แแแแ แแ แ แแชแ แแแแ แ แฉแแแแฌแแ แแ, แแแแ แแแแแแแแแแแ แแแแแแ แแฆแแ แแ แแก. แฉแแแแฌแแ แแแ แจแแแซแแแแ แแฅแกแแแ แขแแ แแแฃแแ แแงแแก Excel-แจแ แแ แฉแแแแงแแแแแแแก แแแแแ แชแฎแ แแแแแแ, แแแแ แแ แแก แแ แแ แแก แฉแแแแ แแแแแแ!
แแแฐแแ แขแแแ แจแแแซแแแแ แแงแแก แแแฉแแแแแแ แ แแแแ แช แแแขแแ แแฅแขแแฃแแ แแ แแคแแแ
แแแแกแแแแแก แฉแแแ แแแแแขแแแ แแแแแ แแ แ แแแแฎแแแแแก แแแแแชแแแแแแก 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
แแ แแขแแแ แแแ แแแแแชแแแแแ Grafana-แแ.
แแแแแแแแ แแ แแคแแแ แกแแฌแงแแกแ
แฎแแแแ แจแแแฎแแ:
แแฃ แแกแฃแ แ, แจแแแแซแแแแ แฉแแขแแแ แแแ แแฅแแแแ แแแแแชแแแแแ แแ แกแฃแ แแแจแ.
PS แกแขแแขแแแแ แแแฐแแ แขแแก แแแแแแแแก แจแแกแแฎแแ SQL-แจแ:
แฌแงแแ แ: www.habr.com