【问题标题】:No values from group by / having query没有来自 group by / 有查询的值
【发布时间】:2021-07-15 05:26:59
【问题描述】:

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

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

表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

【问题讨论】:

  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。
  • 嗨@DaleK 非常感谢您的及时回复,我会考虑您提到的所有要点。我正在尝试为在同一个表中多次存在的特定 rev_id 找到所有 mov_id (在表 'rating$ 中是唯一的)。如果需要任何其他信息,请告诉我。
  • 再次感谢您的建议,@DaleK。我已经更新了这个问题,并会考虑你在下一个问题中关于 DDL+DML 数据的建议,我目前没有这个表。此外,如果您能告诉我一个首选资源来练习 MSSQL 练习,尤其是连接和子查询练习,我将不胜感激。
  • 是的@DaleK,我已经阅读了该资源的答案,但在我试图自己弄清楚时注意到了这一点,因此发布了..

标签: sql sql-server tsql group-by having


【解决方案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,8.40,null),
(914,9013,7.00,862618),
(915,9001,7.70,830095),
(916,9014,4.00,642132),
(925,9015,7.70,81328),
(918,9016,null,580301),
(920,9017,8.10,609451),
(921,9018,8.00,667758),
(922,9019,8.40,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:请不要使用该链接建议的隐式(逗号分隔)连接。它们远非最佳实践。而是使用正确的连接。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 2022-01-26
  • 2021-11-15
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多