Cra*_*aig 0 sql amazon-redshift
我表中的数据如下所示:
date, app, country, sales
2017-01-01,XYZ,US,10000
2017-01-01,XYZ,GB,2000
2017-01-02,XYZ,US,30000
2017-01-02,XYZ,GB,1000
Run Code Online (Sandbox Code Playgroud)
我需要每天为每个应用程序找到美国销售额与GB销售额的比率,因此理想情况下结果如下所示:
date, app, ratio
2017-01-01,XYZ,10000/2000 = 5
2017-01-02,XYZ,30000/1000 = 30
Run Code Online (Sandbox Code Playgroud)
我目前正在将所有内容转储到csv并在Python中离线进行计算,但我想将所有内容都移到SQL端.一种选择是将每个国家聚合成子查询,加入然后划分,例如
select d1_us.date, d1_us.app, d1_us.sales / d1_gb.sales from
(select date, app, sales from table where date between '2017-01-01' and '2017-01-10' and country = 'US') as d1_us
join
(select date, app, sales from table where date between '2017-01-01' and '2017-01-10' and country = 'GB') as d1_gb
on d1_us.app = d1_gb.app and d1_us.date = d1_gb.date
Run Code Online (Sandbox Code Playgroud)
这样做有什么不那么混乱的方法吗?
您可以在查询中使用SUM(CASE WHEN)和GROUP BY的比率来执行此操作,而无需子查询.
SELECT DATE,
APP,
SUM(CASE WHEN COUNTRY = 'US' THEN SALES ELSE 0 END) /
SUM(CASE WHEN COUNTRY = 'GB' THEN SALES END) AS RATIO
FROM TABLE1
GROUP BY DATE, APP;
Run Code Online (Sandbox Code Playgroud)
根据GB销售额为零的可能性,您可以调整GB的ELSE条件ELSE 1,以避免Divide by zero错误.这实际上取决于您希望如何处理异常.