首页 > 试题广场 >

有一个名为app的MySQL数据库表,其建表语句如下: CR

[单选题]
有一个名为app的MySQL数据库表,其建表语句如下:
CREATE TABLE `app` (
`app_id` int(10) DEFAULT '0',//应用ID
`version_code` int(10) DEFAULT '0',//应用的版本号
`download_count` int(10) DEFAULT '0'//当前版本的下载量
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

当前表中数据记录如下,一条记录表示某个应用的某个版本的下载量记录:
+--------+--------------+----------------+
| app_id | version_code | download_count |
+--------+--------------+----------------+
|      1 |           10 |             90 |
|      1 |           11 |            100 |
|      1 |           10 |             20 |
|      2 |           15 |             10 |
|      2 |           16 |             15 |
|      2 |           17 |             30 |
|      2 |           16 |              5 |
|      3 |            2 |             50 |
+--------+--------------+----------------+

问: 下面那个MySQL语句可以查出每个应用中总下载量最大的版本号和次数( )?
  • select t.app_id, t.version_code, max(t.download_sum) from (select app_id, version_code, sum(download_count) download_sum from app
    group by app_id, version_code) as t group by t.app_id having t.download_sum > max(t.download_sum);
  • select  t.version_code, max(t.download_sum) from (select app_id, version_code, sum(download_count) download_sum from app
    group by app_id, version_code order by download_sum desc) as t group by t.version_code;
  • select 1.app_id, l.version_code, max(download_sum) from app l inner join (select app_id , version_code, sum(download_count) as
    download_sum from app group by app_id, version_code ) as t on l.app_id = t.app_id and l.version_code = t.version_code group by
    l.app_id, l.version_code;
  • select app_id, version_code, download_sum
    from (
    select app_id, version_code, sum(download_count) as download_sum,
    row_number() over(partition by app_id order by sum(download_count) desc) as rn
    from app
    group by app_id, version_code
    ) x
    where rn = 1;

Group by只保留分组后的第一行

发表于 2019-10-08 21:55:04 回复(1)
group分组,还能在select上查不是分组选项的列??
发表于 2019-09-14 16:15:21 回复(13)
别讨论了 这题我放进数据库里 每个选项都没能选出题目所要求的结果

发表于 2021-03-04 16:52:34 回复(0)
select t.app_id, t.version_code, t.download_sum
from 
(
	select app_id, version_code, sum(download_count) download_sum 
	from app
	group by app_id, version_code 
) as t 
WHERE	
(
	SELECT count(*) FROM (
		select app_id, sum(download_count) download_sum 
		from app
		group by app_id, version_code 
	) as t2
	WHERE t.app_id = t2.app_id
	AND t.download_sum < t2.download_sum
) < 1;
完美运行
发表于 2020-09-08 15:53:27 回复(0)
来了来了,练了一天的sql,终于熟练了。写了个正确答案,用排序函数增加一个rank1字段,再where rank1 = 1拿到排第一的行。
SELECT app_id,version_code,download_sum FROM 
(
	SELECT app_id,version_code,download_sum,rank() over (PARTITION BY app_id ORDER BY download_sum DESC) AS rank1
	FROM
	(
		SELECT app_id,version_code,SUM(download_count) AS download_sum
		FROM app 
		GROUP BY app_id,version_code
	) t
) t1 WHERE rank1 = 1;



发表于 2020-10-12 21:55:46 回复(1)
咋这么复杂,我咋感觉用个MAX和group by就行了😅
发表于 2019-09-06 17:28:54 回复(6)
//先查询出每个app不同版本号的下载量,作为一张表
SELECT app_id, version_code, SUM(download_count) AS download_sum 
FROM app 
GROUP BY app_id, version_code
ORDER BY app_id,download_sum DESC
//然后借助上一张表,查询每个app不同版本号的最大次数
SELECT t.app_id,MAX(t.download_sum) AS max_download
FROM (SELECT app_id, version_code, SUM(download_count) AS download_sum 
FROM app 
GROUP BY app_id, version_code
ORDER BY app_id,download_sum DESC) AS t
GROUP BY t.app_id;
修正了下查询出版本号

发表于 2021-04-19 21:58:16 回复(0)
发表于 2021-04-02 15:54:37 回复(0)
先说结论,此题有误。
题干解读:查出每个应用总下载量最大的版本号次数:

答案应该如上,代码如下,固此题无答案正确

代码为(未简化):
SELECT * FROM (select app_id , version_code, sum(download_count) as
download_sum from app group by app_id, version_code) as t
WHERE t.download_sum in (SELECT MAX(t.download_sum) FROM 
(select app_id , version_code, sum(download_count) as
download_sum from app group by app_id, version_code) as t 
GROUP BY t.app_id);

编辑于 2021-03-27 04:43:09 回复(0)
这排版,看得我眼睛都瞎了
发表于 2021-03-18 05:39:01 回复(0)
这个题考的是对group by的理解,聚合的颗粒度以group by后面最小的颗粒度为准。所以C选项会导致取出来的是每个app_id的每个version_code下最大的下载量,这和题意不符。只要在语句中的group by后面的1.version_code,C的运行结果就和B一致了。
另外B选项里子查询里的order by没有实际作用,可以删除
发表于 2021-02-16 17:09:13 回复(0)
这题的意思我不太理解
首先表里的信息是 各个应用不同版本对应的下载量
一个应用的版本号和对应的下载量是一对一的

每个应用中总下载量最大的版本号和次数,应该全都是是MAX()而不是出现SUM()  .....??


总下载量不是指不同版本的下载次数累计吗?sum操作的是几行的数据,而版本号是一行对应一个下载量
查出来的数据,总下载量有什么对应的版本号可言,这题目合理吗 

发表于 2020-10-14 15:47:38 回复(3)
mysql 验证 B 正确

这里涉及到一个设置, sql_mode  当你的设置是 ONLY_FULL_GROUP_BY  这里没有一个答案是对的
执行都会报错 就如我们所经常遇到的,group by分组的查询字段非聚合函数包含必须再group by 后,
查询

select@@sql_mode;

修改set @@sql_mode =‘’  这里还有一些其他的值设置。可以百度

发现去掉这个设置,sql简单了许多,加上这个设置sql麻烦好多




 
发表于 2020-09-12 22:24:49 回复(0)
选项A和选项B中属性别名download_sum定义是错误的,缺少AS。
发表于 2020-08-25 08:30:43 回复(3)
<p>题目有误,建议下线该板块</p>
发表于 2020-08-07 17:40:20 回复(0)
我用的sql server,abcd没一个选项是对的。。。。
我自己写了一个,应该可以:
select t.app_id, t.version_code, t.download_sum
from (select app_id, version_code, sum(download_count) as download_sum from app group by app_id, version_code) as t
where t.download_sum in (
select max(download_sum) from (select app_id, version_code, sum(download_count) as download_sum from app group by app_id, version_code
) as t group by app_id)

发表于 2020-07-29 11:42:56 回复(0)
B答案错的,出不了正确的version_code
感觉可以用关联子查询做:
select t.app_id, t.version_code, t.download_sum from (select app_id, version_code, sum(download_count) download_sum from app
group by app_id, version_code ) t where t.download_sum = (select max(b.download_sum) from t b where t.app_id = b.app_id);
编辑于 2020-07-10 18:23:44 回复(0)
sql_mode=only_full_group_by
b语法是正确的,mysql中只要改一下sql_mode就可以在select的时候包含不在group by中的字段
发表于 2020-05-24 09:25:32 回复(0)
为啥都说答案不对呢……我用mysql试了一下B没错啊……
发表于 2020-04-09 14:39:55 回复(0)
A、B、D答案均存在语法错误,version_code必须出现在group by 中;C答案无语法问题,但是结果不符合要求。所以这个题目无答案
发表于 2020-03-13 00:27:25 回复(2)