SQL 服务器 : count duplicates and filter by date

标签 sql sql-server database

我有一个看起来等同于此的数据结构

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/

相关文章:

sql - 获取多个字段的不同信息,其中一些字段为 NULL

php - 使用 PHP + sqlsrv 更新 MSSQL 表

python - 用于从查询集中获取 ID、打乱 ID 并按打乱顺序查询数据库的 Django 代码

Python 与 SQL 数据库的链接

mysql - 如何在 MySQL 数据库表字段中存储 JSON?

javascript - 如何在php中不分离地在一个循环中正确显示所有英文定义?

java - 按父对象设置的子对象的值对父对象进行排序

php - 具有多条记录的 LAST_INSERT_ID() 插入 MySQL

sql-server - SQL Server相当于Oracle Wallet Manager

sql-server - 在具有十亿行的 SQL Server Standard Edition 中进行分区