最简单的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 
  
相关推荐
super_lzb5 小时前
mybatis拦截器ParameterHandler详解
java·数据库·spring boot·spring·mybatis
CV工程师的自我修养6 小时前
数据库出现死锁了。还不知道什么原因引起的?快来看看吧!
数据库
码界奇点6 小时前
灵活性与高性能兼得KingbaseES 对 JSON 数据的全面支持深度解析
数据库·json·es
2501_941871456 小时前
面向微服务链路追踪与全局上下文管理的互联网系统可观测性设计与多语言工程实践分享
大数据·数据库·python
·云扬·6 小时前
MySQL单机多实例部署两种实用方法详解
数据库·mysql·adb
odoo中国6 小时前
Pgpool-II 在 PostgreSQL 中的用例场景与优势
数据库·postgresql·中间件·pgpool
男孩李6 小时前
postgres数据库常用命令介绍
数据库·postgresql
IvorySQL7 小时前
让源码安装不再困难:IvorySQL 一键安装脚本的实现细节解析
数据库·人工智能·postgresql·开源
云和数据.ChenGuang7 小时前
openGauss赋能新能源汽车智能制造——比亚迪MES系统数据库国产化升级案例
数据库·汽车·opengauss·gaussdb·数据库权限管理
洛小豆7 小时前
她问我:数据库还在存 Timestamp?我说:大人,时代变了
数据库·后端·mysql