SQL Server:计数重复项并按日期筛选
我有一个类似于此的数据结构SQL Server:计数重复项并按日期筛选,sql,sql-server,database,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 | 2
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)
但是当与计数混用时,这就不再有效了。我得到了一个错误,沿着这条线
CreatedDateTime在having子句中无效,因为它未包含在聚合函数或group by子句中
有人能帮我找到正确的语法吗?我想你的标准应该在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
这应仅限于最近五周内发生的记录,以及那些推荐
不为空的记录
出现错误的原因是,在计算HAVING
子句时,数据库正在处理记录的聚合。由于CreatedDateTime
字段不是聚合字段,因此导致错误。我认为您的标准应该在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
这应仅限于最近五周内发生的记录,以及那些推荐
不为空的记录
出现错误的原因是,在计算HAVING
子句时,数据库正在处理记录的聚合。由于CreatedDateTime
字段不是聚合,因此会导致错误。将行筛选器移动到中的位置,并将聚合筛选器保留在上
SELECT
Rating,
COUNT(Rating) AS Count
FROM
dbo.tableName
WHERE
UserId = '101' AND
CreatedDateTime > DATEADD(week, - 5, GETDATE()) AND
Recommend IS NOT NULL
GROUP BY
Rating
HAVING
COUNT(Rating) >= 1
ORDER BY
Count DESC
SQL引擎筛选器使用WHERE
条件筛选数据,然后使用GROUP BY
列对行进行分组,最后应用HAVING
条件筛选分组结果。将行筛选器移动到WHERE
并在HAVING
上聚合筛选器
SELECT
Rating,
COUNT(Rating) AS Count
FROM
dbo.tableName
WHERE
UserId = '101' AND
CreatedDateTime > DATEADD(week, - 5, GETDATE()) AND
Recommend IS NOT NULL
GROUP BY
Rating
HAVING
COUNT(Rating) >= 1
ORDER BY
Count DESC
SQL引擎筛选器使用WHERE
条件过滤数据,然后使用GROUP BY
列对行进行分组,最后应用HAVING
条件过滤分组结果。谢谢,我最后通过在select/count中嵌套select BY date来解决问题。但是您的解决方案更加优雅和干净,并取代了我的代码。谢谢,我最终通过在select/count中嵌套select by date来解决问题。但您的解决方案更加优雅和干净,并取代了我的代码。