没有来自 group by / 有查询的值

问题描述

我正在尝试在 sql Server 中运行查询,以便为那些对多部电影进行评分的评论者查找电影标题。请检查下面的查询和图表。

SELECT [mov_id] FROM [dbo].[rating$] 
GROUP BY [mov_id]
HAVING COUNT ([rev_id])>1

enter image description here

rating$ 的数据如下:

mov_id | rev_id | rev_stars | num_o_ratings
--------+--------+-----------+---------------
    901 |   9001 |      8.40 |        263575
    902 |   9002 |      7.90 |         20207
    903 |   9003 |      8.30 |        202778
    906 |   9005 |      8.20 |        484746
    924 |   9006 |      7.30 |
    908 |   9007 |      8.60 |        779489
    909 |   9008 |           |        227235
    910 |   9009 |      3.00 |        195961
    911 |   9010 |      8.10 |        203875
    912 |   9011 |      8.40 |
    914 |   9013 |      7.00 |        862618
    915 |   9001 |      7.70 |        830095
    916 |   9014 |      4.00 |        642132
    925 |   9015 |      7.70 |         81328
    918 |   9016 |           |        580301
    920 |   9017 |      8.10 |        609451
    921 |   9018 |      8.00 |        667758
    922 |   9019 |      8.40 |        511613
    923 |   9020 |      6.70 |         13091

目前我在结果中没有任何价值,而我应该检索 901 和 915 作为值。 任何人帮助了解小姐将不胜感激。

SELECT [mov_id] FROM [dbo].[rating$] 
GROUP BY [mov_id]
HAVING COUNT ([rev_id])>1

解决方法

您不能同时查询这两件事。因此,您可以使用子查询来获取感兴趣的评论者。或者使用窗口函数来计算哪些行是有效的,例如

declare @Rating table (mov_id int,rev_id int,rev_stars decimal(9,2),num_of_ratings int);

insert into @Rating (mov_id,rev_id,rev_stars,num_of_ratings)
values
(901,9001,8.40,263575),(902,9002,7.90,20207),(903,9003,8.30,202778),(906,9005,8.20,484746),(924,9006,7.30,null),(908,9007,8.60,779489),(909,9008,null,227235),(910,9009,3.00,195961),(911,9010,8.10,203875),(912,9011,(914,9013,7.00,862618),(915,7.70,830095),(916,9014,4.00,642132),(925,9015,81328),(918,9016,580301),(920,9017,609451),(921,9018,8.00,667758),(922,9019,511613),(923,9020,6.70,13091);

-- Approach 1: Using Subquery 
SELECT mov_id
FROM @Rating
WHERE rev_id IN (
    SELECT rev_id
    FROM @Rating
    GROUP BY rev_id
    HAVING COUNT (*) > 1
);

-- Approach 2: Using CTE + Window Function
WITH cte AS (
    SELECT mov_id,COUNT(*) OVER (PARTITION BY rev_id) num_reviews
    FROM @Rating
)
SELECT *
FROM cte
WHERE num_reviews > 1;

注意 1:我根据您的数据创建了 DDL+DML,所以如果您可以的话,请以后再做。

注意 2:请不要使用该链接建议的隐式(逗号分隔)连接。它们离最佳实践还很远。而是使用适当的连接。