[英]Calculate conversion using SQL
假设有一个包含两列的activities
表:字符串action
和created_at
时间戳。 并且操作列visit
或signup
只有两个可能的值。
我想查看每天每次访问的注册百分比。 喜欢:
Date | Conversion
--------------------------
2013-01-01 | 30%
2013-01-02 | 27%
2013-01-03 | 15%
2013-01-04 | 22%
一个SQL查询可能吗?
对于SQL Server,这应该可以工作:
SELECT coalesce(v.y, s.y) y, coalesce(v.m, s.m) m, coalesce(v.d, s.d) d,
100.0 * isnull(s.num, 0) / (isnull(s.num, 0) + isnull(v.num, 0)) conversion
FROM
(
SELECT datepart(YEAR, [date]) y, datepart(m, [date]) m,datepart(d, [date]) d,
count(action) num
FROM actions
WHERE action = 'visit'
GROUP BY datepart(YEAR, [date]), datepart(m, [date]), datepart(d, [date])
) v
FULL OUTER JOIN
(
SELECT datepart(YEAR, [date]) y, datepart(m, [date]) m,datepart(d, [date]) d,
count(action) num
FROM actions
WHERE action = 'signup'
GROUP BY datepart(YEAR, [date]), datepart(m, [date]), datepart(d, [date])
) s
ON v.y = s.y AND v.m = s.m AND v.d = s.d
我将字符串串联,舍入和一般鲁棒性作为练习留给您。
如果这是SQL Server 2005+,则可以尝试以下方法:
SELECT
Date,
Conversion = signup * 100.0 / (signup + visit)
FROM (
SELECT
Date = DATEADD(DAY, DATEDIFF(DAY, 0, created_at), 0),
action
FROM activities
) AS a
PIVOT (
COUNT(action) FOR action IN (visit, signup)
) AS p
;
Date
表达式从时间部分剥离了created_at
时间戳。 在SQL Server 2008和更高版本中,可以用更简洁,更有效的强制转换为date
类型的操作来代替它:
Date = CAST(created_at AS date)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.