แžšแž”แŸ€แž”แž”แŸ’แžšแž˜แžผแž›แž€แŸ’แžšแžปแž˜แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž‡แžถแž€แŸ’แžšแžถแž แŸ’แžœแž€แŸ’แž“แžปแž„ Grafana [+ แžšแžผแž”แž—แžถแž– docker แž‡แžถแž˜แžฝแž™แžงแž‘แžถแž แžšแžŽแŸ]

แžšแž”แŸ€แž”แž”แŸ’แžšแž˜แžผแž›แž€แŸ’แžšแžปแž˜แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž‡แžถแž€แŸ’แžšแžถแž แŸ’แžœแž€แŸ’แž“แžปแž„ Grafana [+ แžšแžผแž”แž—แžถแž– docker แž‡แžถแž˜แžฝแž™แžงแž‘แžถแž แžšแžŽแŸ]

แžšแž”แŸ€แž”แžŠแŸ‚แž›แž™แžพแž„แž”แžถแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž”แž‰แŸ’แž แžถแž“แŸƒแž€แžถแžšแž˜แžพแž›แžƒแžพแž‰แž€แŸ’แžšแžปแž˜แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแŸแžœแžถแž€แž˜แŸ’แž˜ Promopult แžŠแŸ„แž™แž”แŸ’แžšแžพ Grafana แŸ”

แž•แŸ’แžŸแž–แŸ’แžœแž•แŸ’แžŸแžถแž™ - แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžŠแŸแž˜แžถแž“แžฅแž‘แŸ’แž’แžทแž–แž›แžŠแŸ‚แž›แž˜แžถแž“แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž…แŸ’แžšแžพแž“แŸ” แž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž› 10 แž†แŸ’แž“แžถแŸ†แž“แŸƒแž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแž…แŸ†แž“แžฝแž“แž“แŸƒแž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž“แŸ…แž€แŸ’แž“แžปแž„แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž˜แžถแž“แž›แžพแžŸแž–แžธแž˜แžฝแž™แž›แžถแž“แŸ” แžขแŸ’แž“แž€แžŠแŸ‚แž›แž”แžถแž“แž‡แžฝแž”แž”แŸ’แžšแž‘แŸ‡แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžŸแŸ’แžšแžŠแŸ€แž„แž‚แŸ’แž“แžถแžŠแžนแž„แžแžถแžขแžถแžšแŸแž“แŸƒแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž“แŸแŸ‡แž‚แžบแž“แŸ…แž†แŸ’แž„แžถแž™แž–แžธแž—แžถแž–แžŠแžผแž…แž‚แŸ’แž“แžถแŸ”

แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž”แžถแž“แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž แžพแž™ "แžŠแŸแž€แž›แž€แŸ‹" แž‡แžถแžšแŸ€แž„แžšแž แžผแžแŸ” แž˜แžถแž“แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž—แŸ’แž›แŸแž…แž–แžถแž€แŸ’แž™แžŸแž˜แŸ’แž„แžถแžแŸ‹แžšแž”แžŸแŸ‹แž–แžฝแž€แž‚แŸ แž แžพแž™แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž–แžธแžšแž”แžธแžŠแž„แž‘แŸ€แžแž€แŸ’แž“แžปแž„แžšแž™แŸˆแž–แŸแž›แž”แŸ’แžšแžถแŸ†แž˜แžฝแž™แžแŸ‚แŸ” แž˜แžถแž“แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž“แžถแŸ†แž™แž€แž”แŸ’แžšแžถแž€แŸ‹แž‘แŸ…แž”แž‰แŸ’แž‡แžธแžŸแžถแž…แŸ‹แž”แŸ’แžšแžถแž€แŸ‹ แž แžพแž™แž˜แžถแž“แž“แžšแžŽแžถแž˜แŸ’แž“แžถแž€แŸ‹แž˜แž€แžŠแŸ„แž™แžฅแžแž‚แžทแžแžแŸ’แž›แŸƒ แžงแž”แž€แžšแžŽแŸ. แž แžพแž™แžœแžถแž‡แžถแž€แžถแžšแž›แŸ’แžขแž€แŸ’แž“แžปแž„แž€แžถแžšแž‘แž‘แžฝแž›แž”แžถแž“แž”แŸ’แžšแžถแž€แŸ‹แž…แŸ†แžŽแŸแž‰แžแŸ’แž›แŸ‡แž–แžธแž˜แž“แžปแžŸแŸ’แžŸแž‚แŸ’แžšแž”แŸ‹แž‚แŸ’แž“แžถแŸ”

แž“แŸ…แž›แžพแžŸแŸ†แžŽแžปแŸ†แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸแž’แŸ†แžŠแžผแž…แž‡แžถแžšแž”แžŸแŸ‹แž™แžพแž„ แž€แžถแžšแžœแžทแž—แžถแž‚แžขแžถแž€แž”แŸ’แž”แž€แžทแžšแžทแž™แžถแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž˜แŸ’แž“แžถแž€แŸ‹แŸ— แž“แžทแž„แž€แžถแžšแžŸแž˜แŸ’แžšแŸแž…แž…แžทแžแŸ’แžแžแŸ’แž“แžถแžแžแžผแž…แž‚แžบแž‚แŸ’แž˜แžถแž“แž“แŸแž™แžขแŸ’แžœแžธแž‘แžถแŸ†แž„แžขแžŸแŸ‹แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž€แžถแžšแž…แžถแž”แŸ‹แž“แžทแž“แŸ’แž“แžถแž€แžถแžš แž“แžทแž„แž’แŸ’แžœแžพแž€แžถแžšแž‡แžถแž˜แžฝแž™แž€แŸ’แžšแžปแž˜แž’แŸ†แž‚แžบแžขแžถแž…แž’แŸ’แžœแžพแž‘แŸ…แž”แžถแž“ แž“แžทแž„แž…แžถแŸ†แž”แžถแž…แŸ‹แŸ” แžŠแŸ‚แž›แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แž™แžพแž„แž’แŸ’แžœแžพแŸ”

แžŸแž„แŸ’แžแŸแž”

  1. แžแžพแž€แžถแžšแžœแžทแž—แžถแž‚แž€แŸ’แžšแžปแž˜แž‚แžบแž‡แžถแžขแŸ’แžœแžธ แž แžพแž™แž แŸแžแžปแžขแŸ’แžœแžธแž”แžถแž“แž‡แžถแžœแžถแžแŸ’แžšแžผแžœแž€แžถแžš?
  2. แžšแž”แŸ€แž”แž”แž„แŸ’แž€แžพแžแž€แŸ’แžšแžปแž˜แžแžถแž˜แžแŸ‚แž“แŸƒแž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž“แŸ…แž€แŸ’แž“แžปแž„ SQL แŸ”
  3. แžšแž”แŸ€แž”แž•แŸ’แž‘แŸแžšแž€แŸ’แžšแžปแž˜แž‘แŸ… แž แŸ’แž‚แŸ’แžšแŸแžŽแžถแžŽแžถ.

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แžŠแžนแž„แžšแžฝแž…แž แžพแž™แžแžถแžแžพแž€แžถแžšแžœแžทแž—แžถแž‚แž€แŸ’แžšแžปแž˜แž‚แžบแž‡แžถแžขแŸ’แžœแžธ แž“แžทแž„แžšแž”แŸ€แž”แž’แŸ’แžœแžพแžœแžถแž“แŸ…แž€แŸ’แž“แžปแž„ SQL แžŸแžผแž˜แžšแŸ†แž›แž„แžแŸ’แžšแž„แŸ‹แž‘แŸ…แž•แŸ’แž“แŸ‚แž€แž…แžปแž„แž€แŸ’แžšแŸ„แž™แŸ”

1. แžแžพแž€แžถแžšแžœแžทแž—แžถแž‚แž€แŸ’แžšแžปแž˜แž‚แžบแž‡แžถแžขแŸ’แžœแžธ แž แžพแž™แž แŸแžแžปแžขแŸ’แžœแžธแž”แžถแž“แž‡แžถแžœแžถแžแŸ’แžšแžผแžœแž€แžถแžš?

แž€แžถแžšแžœแžทแž—แžถแž‚แžแžถแž˜แž€แŸ’แžšแžปแž˜แž‚แžบแž‡แžถแžœแžทแž’แžธแžŸแžถแžŸแŸ’แžแŸ’แžšแž•แŸ’แžขแŸ‚แž€แž›แžพแž€แžถแžšแž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž€แŸ’แžšแžปแž˜แž•แŸ’แžŸแŸแž„แŸ—แž‚แŸ’แž“แžถ (แž€แŸ’แžšแžปแž˜) แž“แŸƒแžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ” แž—แžถแž‚แž…แŸ’แžšแžพแž“แž‡แžถแž‰แžนแž€แž‰แžถแž”แŸ‹ แž€แŸ’แžšแžปแž˜แžšแž”แžŸแŸ‹แž™แžพแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž”แž„แŸ’แž€แžพแžแžกแžพแž„แžŠแŸ„แž™แžŸแž”แŸ’แžแžถแž แŸ แžฌแžแŸ‚แžŠแŸ‚แž›แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž”แžถแž“แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แŸ” แž–แžธแž‘แžธแž“แŸแŸ‡ แžขแžถแž™แžปแž€แžถแž›แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แžแŸ’แžšแžผแžœแž”แžถแž“แž‚แžŽแž“แžถ แž แžพแž™แž“แŸแŸ‡แž‚แžบแž‡แžถแžŸแžผแž…แž“แžถแž€แžšแž˜แžฝแž™แž“แŸ…แž›แžพแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž“แŸƒแž€แžถแžšแžœแžทแž—แžถแž‚แžŠแŸแžŸแŸ’แž˜แžปแž‚แžŸแŸ’แž˜แžถแž‰แžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แžขแž“แžปแžœแžแŸ’แžแŸ” แžงแž‘แžถแž แžšแžŽแŸ แž™แž›แŸ‹แŸ–

  • แžแžพแž†แžถแž“แŸ‚แž›แž€แžถแžšแž‘แžทแž‰แž™แž€แž˜แžถแž“แžฅแž‘แŸ’แž’แžทแž–แž›แž™แŸ‰แžถแž„แžŽแžถแž‘แŸ…แž›แžพแžขแžถแž™แžปแž€แžถแž›แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹;
  • แžšแž”แŸ€แž”แžŠแŸ‚แž›แž€แžถแžšแž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž˜แžปแžแž„แžถแžš แžฌแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แžŽแžถแž˜แžฝแž™แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แžŠแž›แŸ‹แžขแžถแž™แžปแž‡แžธแžœแžทแžแŸ”
  • แžšแž”แŸ€แž”แžŠแŸ‚แž›แž€แžถแžšแž”แžพแž€แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž˜แžปแžแž„แžถแžš X แž”แŸ‰แŸ‡แž–แžถแž›แŸ‹แžŠแž›แŸ‹แžขแžถแž™แžปแž‡แžธแžœแžทแžแž”แžพแž”แŸ’แžšแŸ€แž”แž’แŸ€แž”แž‘แŸ…แž“แžนแž„แž†แŸ’แž“แžถแŸ†แž˜แžปแž“แŸ”

2. แžšแž”แŸ€แž”แž”แž„แŸ’แž€แžพแžแž€แŸ’แžšแžปแž˜แž€แŸ’แž“แžปแž„ SQL?

แž‘แŸ†แž แŸ†แž“แŸƒแžขแžแŸ’แžแž”แž‘ แž“แžทแž„แžŸแžปแž—แžœแžทแž“แžทแž…แŸ’แž†แŸแž™แž˜แžทแž“แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แž™แžพแž„แž”แž„แŸ’แž แžถแž‰แž‘แžทแž“แŸ’แž“แž“แŸแž™แž–แžทแžแžšแž”แžŸแŸ‹แž™แžพแž„แž“แŸ…แž‘แžธแž“แŸแŸ‡แž‘แŸ - แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžถแž€แž›แŸ’แž”แž„ แžŸแŸ’แžแžทแžแžทแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž˜แžฝแž™แž†แŸ’แž“แžถแŸ†แž€แž“แŸ’แž›แŸ‡แŸ– แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ 1200 แž“แžถแž€แŸ‹ แž“แžทแž„แž”แŸ’แžšแžแžทแž”แžแŸ’แžแžทแž€แžถแžšแž…แŸ†แž“แžฝแž“ 53 แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แžขแŸ’แž“แž€แžขแžถแž…แž›แŸแž„แž‡แžถแž˜แžฝแž™แž‘แžทแž“แŸ’แž“แž“แŸแž™แž“แŸแŸ‡ แž™แžพแž„แž”แžถแž“แžšแŸ€แž”แž…แŸ†แžšแžผแž”แž—แžถแž– docker แž‡แžถแž˜แžฝแž™ MySQL แž“แžทแž„ Grafana แžŠแŸ‚แž›แžขแŸ’แž“แž€แžขแžถแž…แž–แžทแžŸแŸ„แž’แž“แŸแžœแžถแžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„แž”แžถแž“แŸ” แž—แŸ’แž‡แžถแž”แŸ‹แž‘แŸ… GitHub แž“แŸ…แž…แžปแž„แž”แž‰แŸ’แž…แž”แŸ‹แž“แŸƒแžขแžแŸ’แžแž”แž‘แŸ”

แž แžพแž™แž“แŸ…แž‘แžธแž“แŸแŸ‡แž™แžพแž„แž“แžนแž„แž”แž„แŸ’แž แžถแž‰แž–แžธแž€แžถแžšแž”แž„แŸ’แž€แžพแžแž€แŸ’แžšแžปแž˜แžŠแŸ„แž™แž”แŸ’แžšแžพแžงแž‘แžถแž แžšแžŽแŸแžŸแžถแž˜แž‰แŸ’แž‰แŸ”

แžงแž”แž˜แžถแžแžถแž™แžพแž„แž˜แžถแž“แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แŸ” แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แž“แŸ…แž‘แžธแž“แŸ„แŸ‡ แž แžพแž™แž…แŸ†แžŽแžถแž™แž”แŸ’แžšแžถแž€แŸ‹แž›แžพแžŸแŸแžœแžถแž€แž˜แŸ’แž˜แŸ” แž™แžผแžš แŸ— แž‘แŸ…แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž”แŸ„แŸ‡แž”แž„แŸ‹แž…แŸ„แž›แŸ” แž™แžพแž„โ€‹แž…แž„แŸ‹โ€‹แžŠแžนแž„โ€‹แžแžถโ€‹แžแžพโ€‹แžขแŸ’แž“แž€โ€‹แž”แŸ’แžšแžพโ€‹แž”แŸ’แžšแžถแžŸแŸ‹โ€‹แžšแžŸแŸ‹โ€‹แž“แŸ…โ€‹แž”แžถแž“โ€‹แž™แžผแžšโ€‹แž”แŸ‰แžปแžŽแŸ’แžŽแžถ แž แžพแž™โ€‹แž…แŸ†แž“แžฝแž“โ€‹แž“แŸƒโ€‹แž–แžฝแž€โ€‹แž‚แŸโ€‹แž’แŸ’แž›แžถแž€แŸ‹โ€‹แž…แžปแŸ‡โ€‹แž”แž“แŸ’แž‘แžถแž”แŸ‹โ€‹แž–แžธโ€‹แžแŸ‚โ€‹แž‘แžธ 1 แž“แžทแž„โ€‹แž‘แžธ 2 แž“แŸƒโ€‹แž€แžถแžšโ€‹แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹โ€‹แžŸแŸแžœแžถแž€แž˜แŸ’แž˜แŸ”

แžŠแžพแž˜แŸ’แž”แžธแž†แŸ’แž›แžพแž™แžŸแŸ†แžŽแžฝแžšแž‘แžถแŸ†แž„แž“แŸแŸ‡ แž™แžพแž„แžแŸ’แžšแžผแžœแž”แž„แŸ’แž€แžพแžแž€แŸ’แžšแžปแž˜แž•แŸ’แžขแŸ‚แž€แž›แžพแžแŸ‚แž“แŸƒแž€แžถแžšแž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡แŸ” แž™แžพแž„แž“แžนแž„แžœแžถแžŸแŸ‹แžœแŸ‚แž„แžŸแž€แž˜แŸ’แž˜แž—แžถแž–แžŠแŸ„แž™แž€แžถแžšแž…แŸ†แžŽแžถแž™แž€แŸ’แž“แžปแž„แžแŸ‚แž“แžธแž˜แžฝแž™แŸ—แŸ” แž‡แŸ†แž“แžฝแžŸแžฑแŸ’แž™แž€แžถแžšแž…แŸ†แžŽแžถแž™ แžขแžถแž…แž˜แžถแž“แž€แžถแžšแž”แž‰แŸ’แž‡แžถแž‘แžทแž‰ แžแŸ’แž›แŸƒแž‡แžถแžœ แžฌแžŸแž€แž˜แŸ’แž˜แž—แžถแž–แž•แŸ’แžขแŸ‚แž€แž›แžพแž–แŸแž›แžœแŸแž›แžถแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแŸ”

แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŠแŸ†แž”แžผแž„

แžงแž‘แžถแž แžšแžŽแŸแžแŸ’แžšแžผแžœแž”แžถแž“แž’แŸ’แžœแžพแžกแžพแž„แž“แŸ…แž€แŸ’แž“แžปแž„ MySQL แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŸแž˜แŸ’แžšแžถแž”แŸ‹ DBMS แž•แŸ’แžŸแŸแž„แž‘แŸ€แžแž˜แžทแž“แž‚แžฝแžšแž˜แžถแž“แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถแžแŸ’แž›แžถแŸ†แž„แž‘แŸแŸ”

แžแžถแžšแžถแž„แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹ - แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แŸ–

แž›แŸแžโ€‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹โ€‹แžขแŸ’แž“แž€โ€‹แž”แŸ’แžšแžพ
แž€แžถแž›แž”แžšแžทแž…แŸ’แž†แŸแž‘โ€‹แž…แžปแŸ‡แž”แž‰แŸ’แž‡แžธ

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

แž›แŸแžโ€‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹โ€‹แžขแŸ’แž“แž€โ€‹แž”แŸ’แžšแžพ
แžแŸ‚แž…แŸแž‰แžœแžทแž€แŸ’แž€แž™แž”แžแŸ’แžš
แž€แžถแž›แž”แžšแžทแž…แŸ’แž†แŸแž‘โ€‹แž…แžปแŸ‡แž”แž‰แŸ’แž‡แžธ
แžแŸ‚แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถ

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

แž›แž‘แŸ’แž’แž•แž›:

แž…แŸ†แž“แžฝแž“แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹
แžแŸ‚แž…แŸแž‰แžœแžทแž€แŸ’แž€แž™แž”แžแŸ’แžš
แžแŸ‚แž…แžปแŸ‡แžˆแŸ’แž˜แŸ„แŸ‡
แžแŸ‚แž—แžถแž–แžแžปแžŸแž‚แŸ’แž“แžถ

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

แž™แžพแž„แž”แžถแž“แžšแŸ€แž“แž–แžธแžšแž”แŸ€แž”แž”แž„แŸ’แž€แžพแžแž€แŸ’แžšแžปแž˜ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸ…แž–แŸแž›แžŠแŸ‚แž›แž˜แžถแž“แž€แŸ†แžŽแžแŸ‹แžแŸ’แžšแžถแž…แŸ’แžšแžพแž“ แžœแžถแž˜แžทแž“แž„แžถแž™แžŸแŸ’แžšแžฝแž›แž€แŸ’แž“แžปแž„แž€แžถแžšแžœแžทแž—แžถแž‚แž–แžฝแž€แž‚แŸแž‘แŸ€แžแž‘แŸแŸ” แž€แŸ†แžŽแžแŸ‹แžแŸ’แžšแžถแžขแžถแž…แžแŸ’แžšแžผแžœแž”แžถแž“แž“แžถแŸ†แž…แŸแž‰แž‘แŸ… 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 แŸ”

แžงแž‘แžถแž แžšแžŽแŸแž€แŸ’แžšแžถแž แŸ’แžœแž–แžธ แž€แžถแžšแž”แž„แŸ’แž แžถแž‰:

แžšแž”แŸ€แž”แž”แŸ’แžšแž˜แžผแž›แž€แŸ’แžšแžปแž˜แžขแŸ’แž“แž€แž”แŸ’แžšแžพแž”แŸ’แžšแžถแžŸแŸ‹แž‡แžถแž€แŸ’แžšแžถแž แŸ’แžœแž€แŸ’แž“แžปแž„ Grafana [+ แžšแžผแž”แž—แžถแž– docker แž‡แžถแž˜แžฝแž™แžงแž‘แžถแž แžšแžŽแŸ]

แž”แŸ‰แŸ‡แžŠแŸ„แž™แžŠแŸƒแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ–

แžƒแŸ’แž›แžถแŸ†แž„ GitHub แž‡แžถแž˜แžฝแž™แžงแž‘แžถแž แžšแžŽแŸ แž‚แžบแž‡แžถแžšแžผแž”แž—แžถแž– docker แž‡แžถแž˜แžฝแž™ MySQL แž“แžทแž„ Grafana แžŠแŸ‚แž›แžขแŸ’แž“แž€แžขแžถแž…แžŠแŸ†แžŽแžพแžšแž€แžถแžšแž›แžพแž€แžปแŸ†แž–แŸ’แž™แžผแž‘แŸแžšแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แŸ” แž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แž˜แžถแž“แž‘แžทแž“แŸ’แž“แž“แŸแž™แžŸแžถแž€แž›แŸ’แž”แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž˜แžฝแž™แž†แŸ’แž“แžถแŸ†แž€แž“แŸ’แž›แŸ‡แžšแžฝแž…แž แžพแž™ แž…แžถแž”แŸ‹แž–แžธแžแŸ‚แž˜แž€แžšแžถ แž†แŸ’แž“แžถแŸ† 2018 แžŠแž›แŸ‹แžแŸ‚แž€แž€แŸ’แž€แžŠแžถ แž†แŸ’แž“แžถแŸ† 2019แŸ”

แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž…แž„แŸ‹แž”แžถแž“ แžขแŸ’แž“แž€แžขแžถแž…แž•แŸ’แž‘แžปแž€แž‘แžทแž“แŸ’แž“แž“แŸแž™แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž‘แŸ…แž€แŸ’แž“แžปแž„แžšแžผแž”แž—แžถแž–แž“แŸแŸ‡แŸ”

แžขแžแŸ’แžแž”แž‘ PS แžขแŸ†แž–แžธแž€แžถแžšแžœแžทแž—แžถแž‚แž€แŸ’แžšแžปแž˜แž€แŸ’แž“แžปแž„ SQLแŸ–

https://chartio.com/resources/tutorials/performing-cohort-analysis-using-mysql/

https://www.holistics.io/blog/calculate-cohort-retention-analysis-with-sql/

แž”แŸ’แžšแž—แž–: www.habr.com

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster