最简单的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 
  
相关推荐
小猿姐4 小时前
实测对比:哪款开源 Kubernetes MySQL Operator 最值得用?(2026 深度评测)
数据库·mysql·云原生
倔强的石头_6 小时前
从 “存得下” 到 “算得快”:工业物联网需要新一代时序数据平台
数据库
TDengine (老段)7 小时前
TDengine IDMP 可视化 —— 分享
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·时序数据
GottdesKrieges8 小时前
OceanBase数据库备份配置
数据库·oceanbase
SPC的存折9 小时前
MySQL 8组复制完全指南
linux·运维·服务器·数据库·mysql
运维行者_9 小时前
OpManager MSP NetFlow Analyzer集成解决方案,应对多客户端网络流量监控挑战
大数据·运维·服务器·网络·数据库·自动化·运维开发
炸炸鱼.10 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
softshow102610 小时前
Etsy 把 1000 个 MySQL 分片迁进 Vitess
数据库·mysql
Ronaldinho Gaúch10 小时前
MySQL基础
数据库·mysql
不剪发的Tony老师11 小时前
Noir:一款键盘驱动的现代化数据库管理工具
数据库·sql