在tableau中计算同比增长

根据项目的名称计算项目金额的增长减少。

今天的金额对比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的性能问题。

在tableau中计算同比增长_第1张图片

39个项目,三万条数据,执行一遍sql用时137s.


接下来改进的方向,优化sql性能,减少执行时间,保证数据的准确性。

即使能够使用sql完成任务,但这个不会是最终的方案,因为在用sql编写时候,没有使用tableau的工具,也就是说为了实现这样一个功能需要有sql背景,这对一个非程序专业的人来说,有点不现实。

所以在实现SQL完成功能之后,再要做的事情就是,相同的功能使用tableau完成一遍。

你可能感兴趣的:(在tableau中计算同比增长)