对SQL Server表中的内容进行计数和命名

对SQL Server表中的内容进行计数和命名,sql,sql-server,Sql,Sql Server,我有一张这样的表格: +-----+-------------+-------------------------+ | id | name | timestamp | +-----+-------------+-------------------------+ | 1 | someName | 2016-04-20 09:41:41.213 | | 2 | someName | 2016-04-20 09:42:41.213 |

我有一张这样的表格:

+-----+-------------+-------------------------+
| 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 |
| ... | ...         | ...                     |
+-----+-------------+-------------------------+
+-------------+-------+
|    name     | count |
+-------------+-------+
| someName    |     2 |
| anotherName |     1 |
+-------------+-------+
现在,我尝试创建一个查询,它选择自时间x以来的所有时间戳,并计算结果中出现相同名称的次数

例如,如果我们将此查询应用于上表,并以
2016-04-20 09:40:41.213
作为计算日期,结果应如下所示:

+-----+-------------+-------------------------+
| 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 |
| ... | ...         | ...                     |
+-----+-------------+-------------------------+
+-------------+-------+
|    name     | count |
+-------------+-------+
| someName    |     2 |
| anotherName |     1 |
+-------------+-------+
到目前为止,我所完成的是以下查询,它提供了名称,但没有提供它们的计数:

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

我浏览了stackoverflow,但找不到适合我需要的解决方案,而且由于我对SQL不是很有经验,我已经没有主意了。

您在问题中提到一个表,然后显示一个包含两个表的查询。这使得我们很难理解这个问题

您需要的是一个简单的聚合:

SELECT name, COUNT(*)
FROM SavedScreenshotsLog
WHERE timestamp > '2016-04-20 09:40:241.213'
GROUP BY name
ORDER BY COUNT(*) DESC;
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;
编辑:

如果需要“0”值,可以使用条件聚合:

SELECT name, COUNT(*)
FROM SavedScreenshotsLog
WHERE timestamp > '2016-04-20 09:40:241.213'
GROUP BY name
ORDER BY COUNT(*) DESC;
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;

请注意,这将运行得较慢,因为在聚合之前的日期上没有筛选器。

您在问题中提到一个表,然后显示一个包含两个表的查询。这使得我们很难理解这个问题

CREATE TABLE #TEST (name varchar(100), dt datetime)

INSERT INTO #TEST VALUES ('someName','2016-04-20 09:41:41.213')
INSERT INTO #TEST VALUES ('someName','2016-04-20 09:41:41.213')
INSERT INTO #TEST VALUES ('anotherName','2016-04-20 09:43:41.213')

declare @YourDatetime datetime = '2016-04-20 09:41:41.213'
SELECT name, count(dt) 
FROM #TEST
WHERE dt >= @YourDatetime
GROUP BY name 
您需要的是一个简单的聚合:

SELECT name, COUNT(*)
FROM SavedScreenshotsLog
WHERE timestamp > '2016-04-20 09:40:241.213'
GROUP BY name
ORDER BY COUNT(*) DESC;
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;
编辑:

如果需要“0”值,可以使用条件聚合:

SELECT name, COUNT(*)
FROM SavedScreenshotsLog
WHERE timestamp > '2016-04-20 09:40:241.213'
GROUP BY name
ORDER BY COUNT(*) DESC;
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;
请注意,这将运行较慢,因为在聚合之前的日期上没有筛选器

CREATE TABLE #TEST (name varchar(100), dt datetime)

INSERT INTO #TEST VALUES ('someName','2016-04-20 09:41:41.213')
INSERT INTO #TEST VALUES ('someName','2016-04-20 09:41:41.213')
INSERT INTO #TEST VALUES ('anotherName','2016-04-20 09:43:41.213')

declare @YourDatetime datetime = '2016-04-20 09:41:41.213'
SELECT name, count(dt) 
FROM #TEST
WHERE dt >= @YourDatetime
GROUP BY name 
我已经发布了答案,因为使用上面的查询可能会在将where子句中的字符串转换为datetime时产生错误,这取决于datetime的格式


我已经发布了答案,因为使用上面的查询可能会在将where子句中的字符串转换为datetime时产生错误,这取决于datetime的格式。

我也有同样的想法,但也被问题的措辞所抛弃。哇,比我预期的简单多了。我想我想得有点过头了,谢谢你!有没有一种简单的方法可以在结果中包含
0
COUNT
值?我有同样的想法,但也被问题的措辞所抛弃。哇,比我想象的要简单得多。我想我想得有点过头了,谢谢你!有没有一种简单的方法可以在结果中包含
0
COUNT
值?除了表变量之外,此查询是从gordon linoff Answer中提取的。请尝试更改默认的日期时间格式并应用该查询,它将不起作用。我添加了我发布答案的原因。当然,它与上面的答案几乎相同,这是一个非常简单的查询,您不可能有很多最佳实践答案。除了表变量之外,此查询是从gordon linoff answer中提取的。请尝试更改默认的日期时间格式并应用查询,它将不起作用。我添加了我发布答案的原因。当然,这与上面的答案几乎相同,这是一个非常简单的查询,你不可能有很多最佳实践答案。