我正在尝试显示网站用户数据的“比例”字段,其中比例将是衡量某个数据源对其转化的贡献的量度(无论可能如何,都无关紧要)。
这是我希望通过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
这只是给出比例的一个实例。使用上面的示例,一月份ID为1的用户将只有一条记录,其比例为0.5。
在显示此比例值之间正确共享数据源方面的任何帮助将不胜感激!
最佳答案
您需要将结果与原始数据结合起来。这是使用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);
关于mysql - SQL-通过除以另一个字段的频率而按比例输出的字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32070908/