所以我想逐个月地将新用户与表中的返回用户进行比较.我有一个表,其中包含用户名和日期戳的每个操作.
例如,我可以轻松拉动执行操作的用户,例如,2011年1月.要查看每个用户是否是新用户,我需要针对之前的所有记录(2011年1月之前)运行用户名.
在我的摸索中,我想出了以下内容:
SELECT ini.username,
MIN(ini.datetime) AS firstAction,
COUNT(ini.datetime) AS numMonth,
(SELECT COUNT(*)
FROM tableActions tot
WHERE tot.username = ini.username
AND tot.datetime < '201101%'
AND tot.datetime > '201001%') AS numTotal
FROM tableActions ini
WHERE DATETIME >= '201101%'
AND DATETIME < '201102%'
GROUP BY ini.username
ORDER BY firstAction
Run Code Online (Sandbox Code Playgroud)
它没有错误,但它也没有完成.似乎非常激烈.
您可以重新编写查询(假设tableactions.datetime是DATETIME数据类型):
SELECT ini.username,
MIN(ini.datetime) AS firstAction,
COUNT(ini.datetime) AS numMonth,
x.numTotal
FROM tableActions ini
LEFT JOIN (SELECT tot.username,
COUNT(*) AS numTotal
FROM tableActions tot
WHERE tot.datetime > '2010-01-01'
AND tot.datetime < '2011-01-01'
GROUP BY tot.username) x ON x.username = ini.username
WHERE ini.datetime BETWEEN '2011-01-01' AND '2011-01-31'
GROUP BY ini.username
ORDER BY firstAction
Run Code Online (Sandbox Code Playgroud)
可能有助于有一个指数username在最低限度,但使用覆盖指数username,datetime是值得考虑的.
在datetime看起来比较可疑- LIKE是唯一支持通配符.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |