计算和命名SQL Server表中的内容

Mar*_*arv 1 sql sql-server

我有一个表格,结构如下:

+-----+-------------+-------------------------+
| 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不是很有经验,所以我没有想法.

Gor*_*off 7

您在问题中提到了一个表,然后显示包含两个表的查询.这使得很难回答这个问题.

你要求的是一个简单的聚合:

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)

请注意,由于聚合之前的日期没有过滤器,因此运行速度会变慢.