我试图表现出一个比例'网站用户数据的字段,其中比例将衡量某个数据源对其转换的贡献程度(无论可能是什么,它都无关紧要)。
这是我希望用SQL实现的那种输出:
Month | ID | Country | Data Source |Proportion
Jan-15 | 1 | UK | GA | 0.5
Jan-15 | 1 | UK | Omniture | 0.5
Jan-15 | 2 | France | GA | 1
Jan-15 | 3 | Germany | GA | 0.25
Jan-15 | 3 | Germany | Omniture | 0.25
Jan-15 | 3 | Germany | Email | 0.25
Jan-15 | 3 | Germany | Moz | 0.25
Feb-15 | 1 | UK | GA | 0.5
Feb-15 | 1 | UK | Omniture | 0.5
Feb-15 | 2 | France | Omniture | 0.5
Feb-15 | 2 | France | GA | 0.5
Feb-15 | 3 | Germany | Omniture | 0.33
Feb-15 | 3 | Germany | Email | 0.33
Feb-15 | 3 | Germany | Moz | 0.33
Mar-15 | 1 | UK | Omniture | 0.5
Mar-15 | 1 | UK | GA | 0.5
Mar-15 | 2 | France | Omniture | 0.5
Mar-15 | 2 | France | Email | 0.5
这是我目前正在使用的SQL失败:
SELECT
MONTH(registrationDate), country, DataSource, 1/COUNT(ID)
FROM
data_table
WHERE
registrationDate IS NOT NULL
GROUP BY
MONTH(registrationDate), ID
这只是给出一个比例的实例。使用上面的示例,1月份ID为1的用户只有一条比例= 0.5的记录。
非常感谢在数据源之间正确共享显示此比例值的任何帮助!
答案 0 :(得分:1)
您需要将结果与原始数据相结合。以下是使用JOIN
的方法:
SELECT dt.*, ddt.value
FROM data_table dt JOIN
(SELECT MONTH(registrationDate) as mon, ID,
1.0/COUNT(applicantId) as value
FROM data_table
WHERE registrationDate IS NOT NULL
GROUP BY MONTH(registrationDate), ID
) ddt
ON ddt.id = dt.id AND
ddt.mon = MONTH(dt.registrationDate);
您的问题包含ID
,ApplicationId
和RegistrationId
。我不确定使用哪个正确的列。
编辑:
包括年份(在所有情况下都是一个好主意):
SELECT dt.*, ddt.value
FROM data_table dt JOIN
(SELECT YEAR(registrationDate) as yyyy, MONTH(registrationDate) as mon, ID,
1.0/COUNT(applicantId) as value
FROM data_table
WHERE registrationDate IS NOT NULL
GROUP BY YEAR(registrationDate), MONTH(registrationDate), ID
) ddt
ON ddt.id = dt.id AND
ddt.mon = MONTH(dt.registrationDate) AND
ddt.yyyy = YEAR(dt.registrationDate);