我有一个看起来等同于此的数据结构
UserID| Rating | CreatedDate |
------+--------+-------------+
101 | 10 | 21-02-2018 |
101 | 10 | 18-02-2018 |
102 | 6 | 12-01-2018 |
103 | 3 | 01-02-2018 |
101 | 8 | 25-03-2018 |
102 | 2 | 21-02-2017 |
101 | 1 | 21-08-2017 |
我正在尝试从 SQL Server 2017 中检索特定用户给出的所有不同评分 (1-10) 的计数。
我正在使用这段代码:
SELECT Rating, COUNT(Rating) AS Count
FROM dbo.tableName
GROUP BY Rating, UserId
HAVING (COUNT(Rating) >= 1) AND (UserId = '101')
ORDER BY Count DESC
但是我遇到的问题是,我希望只对过去 5 周内创建的条目运行此查询,以过滤到我以前使用的最后 5 周:
(CreatedDateTime > DATEADD(week, - 5, GETDATE())) AND (Recommend IS NOT NULL)
但是当与 Count
混合使用时,它就不再起作用了。我得到一个错误
CreatedDateTime is invalid in the having clause because it is not contained in either aggregate function or group by clause
谁能帮我得到正确的语法?
最佳答案
我认为你的条件应该在 WHERE
子句中:
SELECT
Rating,
COUNT(Rating) AS Count
FROM dbo.tableName
WHERE
CreatedDateTime > DATEADD(week, - 5, GETDATE()) AND
Recommend IS NOT NULL
GROUP BY
Rating,
UserId
HAVING
COUNT(Rating) >= 1 AND UserId = '101'
ORDER BY
Count DESC
这应该仅限于最近五周内发生的记录,以及那些 Recommend
不为 NULL 的记录。
您收到错误的原因是,在评估 HAVING
子句时,数据库正在处理记录的聚合。由于 CreatedDateTime
字段不是聚合,因此导致错误。
关于SQL 服务器 : count duplicates and filter by date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49532891/