我有一个表格,结构如下:
+-----+-------------+-------------------------+
| id | name | timestamp |
+-----+-------------+-------------------------+
| 1 | someName | 2016-04-20 09:41:41.213 |
| 2 | someName | 2016-04-20 09:42:41.213 |
| 3 | anotherName | 2016-04-20 09:43:41.213 |
| ... | ... | ... |
+-----+-------------+-------------------------+
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试创建一个查询,它从时间x开始选择所有时间戳,并计算结果中出现相同名称的次数.
例如,如果我们将此查询应用于上表,2016-04-20 09:40:41.213并且应该计算其上的日期,结果应如下所示:
+-------------+-------+
| name | count |
+-------------+-------+
| someName | 2 |
| anotherName | 1 |
+-------------+-------+
Run Code Online (Sandbox Code Playgroud)
到目前为止我所完成的是以下查询,它给出了名称,但不是它们的计数:
WITH screenshots AS
(
SELECT * FROM SavedScreenshotsLog
WHERE timestamp > '2016-04-20 09:40:241.213'
)
SELECT s.name
FROM SavedScreenshotsLog s
INNER JOIN screenshots sc ON sc.name = s.name AND sc.timestamp = s.timestamp
ORDER BY s.name
Run Code Online (Sandbox Code Playgroud)
我浏览了stackoverflow,但无法找到符合我需求的解决方案,因为我对SQL不是很有经验,所以我没有想法.
您在问题中提到了一个表,然后显示包含两个表的查询.这使得很难回答这个问题.
你要求的是一个简单的聚合:
SELECT name, COUNT(*)
FROM SavedScreenshotsLog
WHERE timestamp > '2016-04-20 09:40:241.213'
GROUP BY name
ORDER BY COUNT(*) DESC;
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您想要"0"值,则可以使用条件聚合:
SELECT name,
SUM(CASE WHEN timestamp > '2016-04-20 09:40:241.213' THEN 1 ELSE 0 END) as cnt
FROM SavedScreenshotsLog
GROUP BY name
ORDER BY cnt DESC;
Run Code Online (Sandbox Code Playgroud)
请注意,由于聚合之前的日期没有过滤器,因此运行速度会变慢.