最简单的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 
  
相关推荐
TDengine (老段)10 分钟前
TDengine taosAdapter — 多协议网关详解
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Nturmoils11 分钟前
SQL Server 迁移到 KingbaseES:一次复杂 BI 查询的性能实测
数据库
蒲公英eric24 分钟前
从布尔盲注到参数化查询:DVWA SQL 盲注模块完整漏洞分析教程
sql·web安全·ai·dvwa·ai安全·sql 盲注
今天AI了吗1 小时前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql
灯澜忆梦1 小时前
【MySQL11】进阶篇 | 索引_#3使用规则
数据库·sql·mysql·性能优化
名字还没想好☜1 小时前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go
wWYy.2 小时前
Mysql:有哪些锁?
数据库·mysql
李可以量化2 小时前
Tornado 从了解到精通(一)下:异步与非阻塞 IO 核心原理
java·数据库·tornado
云技纵横2 小时前
线上接口突然超时,怎么判断卡在 Nginx、线程池、连接池还是 SQL?
后端·sql·mysql
VALENIAN瓦伦尼安教学设备2 小时前
ASHOOTER激光对中仪如何通过颜色确定调整是否合适
数据库·嵌入式硬件·算法