前言
就一直向前走吧,沿途的花終將綻放~
題目:主播同時在線人數問題
如下為某直播平臺主播開播及關播時間,根據該數據計算出平臺最高峰同時在線的主播人數。
id stt edt
1001,2021-06-14 12:12:12,2021-06-14 18:12:12
1003,2021-06-14 13:12:12,2021-06-14 16:12:12
1004,2021-06-14 13:15:12,2021-06-14 20:12:12
1002,2021-06-14 15:12:12,2021-06-14 16:12:12
1005,2021-06-14 15:18:12,2021-06-14 20:12:12
1001,2021-06-14 20:12:12,2021-06-14 23:12:12
1006,2021-06-14 21:12:12,2021-06-14 23:15:12
1007,2021-06-14 22:12:12,2021-06-14 23:10:12
建表:
數據準備:
create table t16(id int,stt string,edt string
)row format delimited fields terminated by '\t';插入數據:
load data local inpath '/opt/data/t16.txt' overwrite into table t16;
需求實現:
select max(c2)
from (select c1,flag,sum(flag) over(order by c1,id) c2from(select id,stt as c1,1 flag from t16union allselect id,edt as c1,-1 flag from t16)t1)t2;
hsql語句分析:
內部查詢(子查詢t1):
- 從
t16
表中選擇了兩列,并為它們分別賦予了別名c1
和flag
。- 對于
t16
表中的每一行,如果它是stt
列,則flag
為1,并作為c1
的值;如果它是edt
列,則flag
為-1,并作為c1
的值。這實際上是通過UNION ALL
將兩個結果集合并成一個,其中一個結果集包含stt
作為正值,另一個結果集包含edt
作為負值。中間查詢(子查詢t2):
- 使用了窗口函數
SUM(flag) OVER (ORDER BY c1, id)
來計算累積和。這個累積和是根據c1
(即原始的stt
或edt
)和id
的順序來計算的。- 結果集中的每一行都包含
c1
、flag
和累積和c2
。外部查詢:
- 從中間查詢
t2
中選擇累積和c2
的最大值。