根据项目的名称计算项目金额的增长减少。
今天的金额对比1天变化多少
今天的金额对比7天前变化多少
今天的金额对比30天前变化多少
- 使用sql实现一遍
- 使用tableau自带函数实现一遍
使用sql实现一遍
- 将四个时间分别取出来(今天,昨天,七天前,一个月前)
- 计算百分比
- 根据项目汇总
现在的问题是什么?
SELECT T_A.coin_name
,SUM(CASE DATEDIFF(T_B.max_date,T_A.cmc_supply_date)
WHEN 1
THEN ( CONVERT(T_C.cmc_price_usd,DECIMAL) - CONVERT(T_A.cmc_price_usd,DECIMAL) ) / CONVERT(T_C.cmc_price_usd,DECIMAL)
ELSE 0
END) as percent_change_1d
,SUM(CASE DATEDIFF(T_B.max_date,T_A.cmc_supply_date)
WHEN 7
THEN ( CONVERT(T_C.cmc_price_usd,DECIMAL) - CONVERT(T_A.cmc_price_usd,DECIMAL) ) / CONVERT(T_C.cmc_price_usd,DECIMAL)
ELSE 0
END) as percent_change_7d
,SUM(CASE DATEDIFF(T_B.max_date,T_A.cmc_supply_date)
WHEN 30
THEN ( CONVERT(T_C.cmc_price_usd,DECIMAL) - CONVERT(T_A.cmc_price_usd,DECIMAL) ) / CONVERT(T_C.cmc_price_usd,DECIMAL)
ELSE 0
END) as percent_change_30d
FROM FACT_CMC_HISTORY_PRICE T_A
LEFT JOIN
(
SELECT coin_name,MAX(cmc_supply_date) as max_date FROM FACT_CMC_HISTORY_PRICE
GROUP BY coin_name
) T_B on T_A.coin_name = T_B.coin_name
LEFT JOIN
(
SELECT coin_name,cmc_supply_date,cmc_price_usd FROM FACT_CMC_HISTORY_PRICE
) T_C on T_B.coin_name = T_C.coin_name and T_B.max_date = T_C.cmc_supply_date
-- WHERE percent_change_1d is not NULL
-- WHERE T_A.coin_name = 'BTC'
GROUP BY T_A.coin_name
计算出来的结果如下图所示。
其中有一些数值看起来不正常,比如那些三个变化值都是0的地方。
sql语句基本实现了计算隔日增长,7天增长,30天增长,数据的正确性还需要验证,还有一个就是sql的性能问题。
39个项目,三万条数据,执行一遍sql用时137s.
接下来改进的方向,优化sql性能,减少执行时间,保证数据的准确性。
即使能够使用sql完成任务,但这个不会是最终的方案,因为在用sql编写时候,没有使用tableau的工具,也就是说为了实现这样一个功能需要有sql背景,这对一个非程序专业的人来说,有点不现实。
所以在实现SQL完成功能之后,再要做的事情就是,相同的功能使用tableau完成一遍。