最简单的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 
  
相关推荐
十二同学啊12 小时前
向量数据库:从核心原理到 RAG 与 Java 实战
数据库
蓝速科技13 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
一 乐15 小时前
二手交易平台|基于springboot + vue二手交易平台(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序
SelectDB16 小时前
同等资源下 Apache Doris 4.2 vs StarRocks 4.1.1:1TB SSB 与 TPC-H 性能实测
大数据·数据库·数据分析
这个DBA有点耶16 小时前
数据库集群与分布式架构:三条技术路线对比、金仓KES RAC实测数据与决策框架
数据库·程序员·架构
MayBaymax16 小时前
MongoDB 索引与事务
java·数据库·mongodb
SelectDB16 小时前
Doris vs ClickHouse:企业 OLAP 走向下一阶段,两种技术路线如何选择
大数据·数据库·数据分析
vx-程序开发16 小时前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
一 乐17 小时前
养老院管理系统|基于springboot + vue养老院管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
这个DBA有点耶18 小时前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构