flink cdc 讀取mysql的binlog寫入hive中
阿新 • • 發佈:2021-01-21
需求:查詢最近12個月的資料量,此處表的名稱為:ticket_ticket
按月查詢資料,sql語句如下:
SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t
FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m')
查詢結果:
可以看出只有兩個月份,不滿足需求。
解決方案如下:
步驟一:生成一個月份表,包含最近的12個月
sql如下:
SELECT DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date FROM ( SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH ) FROM ticket_ticket LIMIT 12)d ORDER BY date
結果如下:
步驟二:將查詢結果表併入月份表
sql語句:
SELECT * FROM ( SELECT DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date FROM ( SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH ) FROM ticket_ticket LIMIT 12)d ORDER BY date )date_c LEFT JOIN ( SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m') )tab ON t=date
結果如下:
步驟三:處理查詢結果:NULL設定為0,並按照月份排序
sql語句:
SELECT date as 月份, IFNULL(tab.num, 0) as 數量 FROM ( SELECT DATE_FORMAT(@cdate := date_add( @cdate, INTERVAL - 1 MONTH ),'%Y-%m') as date FROM ( SELECT @cdate := date_add(CURDATE(), INTERVAL 1 MONTH ) FROM ticket_ticket LIMIT 12)d ORDER BY date )date_c LEFT JOIN ( SELECT COUNT(*) as num, DATE_FORMAT(create_at,'%Y-%m') as t FROM ticket_ticket WHERE flow_id=336 GROUP BY DATE_FORMAT(create_at,'%Y-%m') )tab ON t=date
結果如下:
總結這裡用到的sql語句
- DATE_FORMAT(date,format)
定義:用於以不同的格式顯示日期/時間資料。即對時間進行格式轉換
用法:date 引數是合法的日期。format 規定日期/時間的輸出格式。
DATE_FORMAT('2021-02-12','%Y-%m')
輸出:2021-02
- CURDATE()
定義:返回當前日期
用法:直接使用CURDATE()
SELECT NOW(),CURDATE(),CURTIME()
結果: