最简单的sql求最大值

用户登录直播间
假设只有一天数据
userid roomid entertime outtime
1 1 2015-01-01 14:00:01 2015-01-01 15:00:00
1 2 2015-01-01 15:00:01 2015-01-01 17:00:00
1 3
2 1
求峰值 直播间峰值用户数 和时间段。
求峰值 直播间峰值用户数 和时间段。(只有一天数据,直播间不会呆超过24小时)

sql 复制代码
  CREATE TABLE broadcastroom(
        userid         varchar2(32) , 
        roomid      varchar2(32)
            
);


SELECT * FROM broadcastroom;



INSERT INTO  broadcastroom VALUES ('1','1');
INSERT INTO  broadcastroom VALUES ('1','2');
INSERT INTO  broadcastroom VALUES ('1','3');
INSERT INTO  broadcastroom VALUES ('2','1');
INSERT INTO  broadcastroom VALUES ('3','1');
INSERT INTO  broadcastroom VALUES ('4','2');





-- 每个房间有多少人

with tmp1 as (
select roomid
      ,count(distinct userid) rn
from broadcastroom
group by roomid 
) 
,tmp2 AS (
SELECT 
     roomid
    ,rn 
    ,ROW_NUMBER()over(ORDER BY rn DESC ) n
 -- ,rank()over(order by rn desc) n
 -- 有并列第一的时候 需要用到 rank()over()
 FROM tmp1 
) 
SELECT      
     roomid
    ,rn 
FROM tmp2 
WHERE n=1

思路

1 求出每个房间多少人

2 根据人数从大道小排序

选出最大的那个

例题2

用户浏览短视频的表 table1 userid videoid starttime endtime

表2 videoid videolength

表3 userid sex

求观看超过50个短视频女性, 完播率最高的TOP10 用户

--第一步 先求观看超过50个短视频的用户

sql 复制代码
with tmp1 as (
select 
     userid
     ,count(distinct videoid)
 from table1
group by 
      userid
having count(distinct videoid)>=50
)
-- 女性用户
,tmp2 as (
select 
     a.userid	 
  from tmp1 a 
 inner join table2 b   
    on a.userid = b.userid
   and b.sex='femin' 
)
,tmp3 as (
-- 完播率排序
 select 
       userid 
	  ,videoid  
	  ,endtime-starttime as difftime
  from table1 a 
 inner join tmp2 b  
    on a.userid = b.userid 
) 
,tmp4 as (
 select 
        userid 
	   ,videoid  
	   ,row_number()over(partition by userid,videoid order by difftime desc ) rn 
	from tmp3  
) 
select 
       userid 
	  ,videoid 
from tmp4 
where rn<=10	
  
  
  
  

如果是关系型数据库oracle 12c版本以上的写法则为

sql 复制代码
SELECT roomid
       ,count(DISTINCT userid) AS n
FROM broadcastroom 
GROUP BY roomid 
ORDER BY n DESC 
FETCH FIRST 1 ROWS only    -- limit 1 

MYSQL 的写法

sql 复制代码
SELECT roomid
       ,count(DISTINCT userid) AS n
FROM broadcastroom 
GROUP BY roomid 
ORDER BY n DESC 
limit 1 
sql 复制代码
SELECT 
       roomid 
      ,count(DISTINCT userid) AS n
      ,rank()over(ORDER BY count(DISTINCT userid) desc) AS rk
      -- 并列以后就没有第2名了 
      ,row_number()over(ORDER BY count(DISTINCT userid) desc) rn
      -- 房间1 和房间2 都是3个人 ,都是第一名,用rownumber的时候会随机选择一个为第一名 另一个为第2名 这就是一个随机的问题 
      ,dense_rank()over(ORDER BY count(DISTINCT userid) desc) dr 
      -- 不跳过并列名次的人 有第一第二第三。 
  FROM broadcastroom
 GROUP BY 
       roomid
sql 复制代码
WITH tmp1 AS (
SELECT 
       roomid 
      ,count(DISTINCT userid) AS n
      ,rank()over(ORDER BY count(DISTINCT userid) desc) AS rk
      -- 并列以后就没有第2名了 
      ,row_number()over(ORDER BY count(DISTINCT userid) desc) rn
      -- 房间1 和房间2 都是3个人 ,都是第一名,用rownumber的时候会随机选择一个为第一名 另一个为第2名 这就是一个随机的问题 
      ,dense_rank()over(ORDER BY count(DISTINCT userid) desc) dr 
      -- 不跳过并列名次的人 有第一第二第三。 
  FROM broadcastroom
 GROUP BY 
       roomid
) 
SELECT roomid 
      ,n
FROM tmp1 
WHERE rk=1 
  
相关推荐
KIDULT°3 小时前
MySQL系列 (1):数据库原理
运维·数据库·mysql·云计算
我不是程序员三三3 小时前
透明加密软件偶发解密异常排错实录:文件时能打开时乱码
数据库·域智盾
snhna3 小时前
向量数据库深度实战:从 HNSW 到 pgvector、Milvus 选型与 RAG 落地
数据库·人工智能·python·postgresql·milvus
天行健,君子而铎3 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
网络·数据库·安全
牛战士coding4 小时前
MySQL 读写分离完整链路:主从复制、多数据源与 @DS 路由
数据库·mysql
goehou5 小时前
MCP 查数实战:让 LLM 安全地查数据库(只读账号、SQL 校验、参数漂移)
数据库·ai·llm·教程·mcp·function calling
我不会插花弄玉5 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
周小董5 小时前
[1369]Windows上安装PostgreSQL
数据库·windows·postgresql
一只积极向上的小咸鱼7 小时前
第一性原理思考:从拆解问题到用实验检验答案
数据库
这个DBA有点耶8 小时前
时序数据库InfluxDB高基数问题深度拆解:内存索引膨胀机制与OOM完整链路
数据库·架构·dba