色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過SQL計算同時在線問題

數據分析與開發 ? 來源:CSDN博客 ? 作者:石榴公子YYDS ? 2021-09-30 14:22 ? 次閱讀

本文是通過 SQL 計算同時在線問題,即求最高在線人數以及最高峰時間段。

0 需求分析

數據為主播ID,stt表示開播時間,edt表示下播時間。

idsttedt

10012021-06-14 12122021-06-14 1812

10032021-06-14 13122021-06-14 1612

10042021-06-14 13122021-06-14 2012

10022021-06-14 15122021-06-14 1612

10052021-06-14 15122021-06-14 2012

10012021-06-14 20122021-06-14 2312

10062021-06-14 21122021-06-14 2312

10072021-06-14 22122021-06-14 2312

求:

(1)該平臺某一天主播同時在線人數最高為多少?

(2)出現最高峰的時間段是哪個時間?

1 數據準備

(1)數據

vim play.txt

idstt edt

10012021-06-14 1212 2021-06-14 1812

10032021-06-14 13122021-06-14 1612

10042021-06-14 13122021-06-14 2012

10022021-06-14 15122021-06-14 1612

10052021-06-14 15122021-06-14 2012

10012021-06-14 20122021-06-14 2312

10062021-06-14 21122021-06-14 2312

10072021-06-14 22122021-06-14 2312

(2) 建表

create table if not exists play(

id string,

stt string,

edt string

row format delimitedfields terminated by ‘ ’

;

(3 )加載數據

load data local inpath “/home/centos/dan_test/play.txt” into table play;

(4) 查詢數據

hive》 select * from play;

OK

1001 2021-06-14 12:12:12 2021-06-14 18:12:121003 2021-06-14 13:12:12 2021-06-14 16:12:121004 2021-06-14 13:15:12 2021-06-14 20:12:121002 2021-06-14 15:12:12 2021-06-14 16:12:121005 2021-06-14 15:18:12 2021-06-14 20:12:121001 2021-06-14 20:12:12 2021-06-14 23:12:121006 2021-06-14 21:12:12 2021-06-14 23:15:121007 2021-06-14 22:12:12 2021-06-14 23:10:12

Time taken: 0.087 seconds, Fetched: 8 row(s)

2 數據分析

問題1分析:

本題如果直接從SQL本身很難下手,無從做起,不妨我們換個思路,假定我們拿到的是一條數據,現在用java程序怎么做?其實就是一個累加器的思想(如SPARK的累加器)。首先我們需要將這樣一條記錄進行拆分,分成不同的記錄或數據流進入累加器,然后給每條記錄進行標記,如果開播的話該條記錄記為1,下播的話記為-1,此時的數據流按照時間順序依次進入累加器,然后在累加器中進行疊加,其中累計的結果最大時候就是所求的結果。其實本質是利用累加器思想,但進入累加器的數據是按時間排好序的時序流數據(數據進入按時間先后順序進入)。

上述思路總結如下:

(1)將數據切分(按起始時間和結束時間)

(2)數據進行標簽,開播的記錄為記為1,下播的記錄記為-1用于累加

(2)將數據按時間進行排序

(3)數據進入累加器進行累加

(4)獲取累加器中當前累加值最大的數值

有了以上思路后,我們將其轉換為SQL求解思路。

(1)將數據切分:實際上就是將開播時間和下播時間轉換成一條條記錄。也就是列轉行,我們用熟悉的UNION操作,進行轉換。

select id,stt dt from play

unionselect id,edt dt from play

--------------------------------------------------------------------------------

OK

1001 2021-06-14 12:12:121001 2021-06-14 18:12:121001 2021-06-14 20:12:121001 2021-06-14 23:12:121002 2021-06-14 15:12:121002 2021-06-14 16:12:121003 2021-06-14 13:12:121003 2021-06-14 16:12:121004 2021-06-14 13:15:121004 2021-06-14 20:12:121005 2021-06-14 15:18:121005 2021-06-14 20:12:121006 2021-06-14 21:12:121006 2021-06-14 23:15:121007 2021-06-14 22:12:121007 2021-06-14 23:10:12

Time taken: 20.502 seconds, Fetched: 16 row(s)

(2) 數據標記。在上述SQL基礎上直接進行標記即可。如果數據本來就是分開的則用case when進行標記。

select id,stt dt , 1 flag from play

unionselect id,edt dt ,-1 flag from play

--------------------------------------------------------------------------------

OK

1001 2021-06-14 12:12:12 11001 2021-06-14 18:12:12 -11001 2021-06-14 20:12:12 11001 2021-06-14 23:12:12 -11002 2021-06-14 15:12:12 11002 2021-06-14 16:12:12 -11003 2021-06-14 13:12:12 11003 2021-06-14 16:12:12 -11004 2021-06-14 13:15:12 11004 2021-06-14 20:12:12 -11005 2021-06-14 15:18:12 11005 2021-06-14 20:12:12 -11006 2021-06-14 21:12:12 11006 2021-06-14 23:15:12 -11007 2021-06-14 22:12:12 11007 2021-06-14 23:10:12 -1

Time taken: 7.408 seconds, Fetched: 16 row(s)

(3)數據按照時間排序,進入累加器進行累加(按時間排序是累加的關鍵)

select id

,dt

,sum(flag) over(order by dt) as cur_cnt

from(

select id,stt dt , 1 flag from play

union

select id,edt dt ,-1 flag from play

) t

--------------------------------------------------------------------------------

OK

1001 2021-06-14 12:12:12 11003 2021-06-14 13:12:12 21004 2021-06-14 13:15:12 31002 2021-06-14 15:12:12 41005 2021-06-14 15:18:12 51002 2021-06-14 16:12:12 31003 2021-06-14 16:12:12 31001 2021-06-14 18:12:12 21001 2021-06-14 20:12:12 11004 2021-06-14 20:12:12 11005 2021-06-14 20:12:12 11006 2021-06-14 21:12:12 21007 2021-06-14 22:12:12 31007 2021-06-14 23:10:12 21001 2021-06-14 23:12:12 11006 2021-06-14 23:15:12 0

Time taken: 8.133 seconds, Fetched: 16 row(s)

(4) 獲取累加器中當前時刻累加的最大值,即為同時開播最多的人數

select max(cur_cnt)

from(

select id

,dt

,sum(flag) over(order by dt) as cur_cnt

from(

select id,stt dt , 1 flag from play

union

select id,edt dt ,-1 flag from play

) t

) m

--------------------------------------------------------------------------------

OK

5

Time taken: 13.087 seconds, Fetched: 1 row(s)

問題2分析:

第二問求的是出現高峰時的時間段,也就是高峰時間的起始時間及結束時間,或持續時長。

借鑒第一問的結果進行分析:

select *,max(cur_cnt) over()

from(

select id

,dt

,sum(flag) over(order by dt) as cur_cnt

from(

select id,stt dt , 1 flag from play

union

select id,edt dt ,-1 flag from play

) t

) m

通過上圖我們可以看出當由峰值出的記錄時間到下一條記錄人數減少的時候這一段時間即為峰值持續的時間,或高峰的時間段,也就是求出峰值的下一條記錄的時間與峰值對應記錄的時間即為高峰時間段,因此利用lead()函數很容易求出問題的答案。SQL如下:

select max_cur_cnt

,dt as start_time

,lead_dt as end_time

from(

select *

,lead(dt,1,dt) over(order by dt) lead_dt

from(

select *,max(cur_cnt) over() as max_cur_cnt

from(

select id

,dt

,flag

,sum(flag) over(order by dt) as cur_cnt

from(

select id,stt dt , 1 flag from play

union

select id,edt dt ,-1 flag from play

) t

) m

) n

) p

where cur_cnt=max_cur_cnt

計算結果如下:

--------------------------------------------------------------------------------

OK

5 2021-06-14 15:18:12 2021-06-14 16:12:12

Time taken: 17.513 seconds, Fetched: 1 row(s)

3 小結

本文針對SQL統計同時在線人數問題進行了分析,利用累加器思想對該問題進行求解,最終劃歸為時序數據,進行時序數據分析(常用技巧:打標簽,形成序列,多序列進行分析),最后利用sum() over()對標簽進行累加求出當前在線人數本題最關鍵的點在于轉換為時序數據及累加器的思想,望讀者能夠掌握。

事實上該問題的分析在業務上具有重要的意義,我們能夠實時跟蹤隨著時間變化的在線人數,了解服務器的負載變化情況,服務器的實時并發數等。該問題在不同業務場景下,有不同意義,比如某個游戲的同時在線人數,比如某個服務器的實時并發數,比如某個倉庫的貨物積壓數量,某一段時間內的同時處于服務過程中的最大訂單量等。實際上求最大在線人數和求實時在線人數是一回事,最大人數依賴于當前在線人數表,只有先求出當前在線人數表,才能求出最大同時在線人數。

不謀全局者,不足以謀一域。

不謀萬世者,不足以謀一時。

作者: 石榴公子YYDS

https://blog.csdn.net/godlovedaniel/article/details/118651811

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7134

    瀏覽量

    89410
  • SQL
    SQL
    +關注

    關注

    1

    文章

    773

    瀏覽量

    44219

原文標題:3 小結

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Devart: dbForge Compare Bundle for SQL Server—比較SQL數據庫最簡單、最準確的方法

    、備份和腳本文件夾中的數據差異。它可以同步任意數量數據庫中的數據,只需點擊幾下即可恢復損壞或丟失的數據。 dbForge模式比較 幫助比較數據庫模式,分析差異,并通過SQL腳本同步差異。它適用于所有
    的頭像 發表于 01-17 11:35 ?119次閱讀

    dbForge Studio For SQL Server:用于有效開發的最佳SQL Server集成開發環境

    dbForge Studio For SQL Server:用于有效開發的最佳SQL Server集成開發環境 SQL編碼助手 SQL代碼分析 查詢分析器 可視化查詢生成器 數據和模式
    的頭像 發表于 01-16 10:36 ?86次閱讀

    通過Skyvia Connect SQL終端節點訪問任何數據

    通過 Skyvia Connect SQL 終端節點訪問任何數據 ? 通過 Skyvia Connect SQL 終端節點訪問任何數據ADO.NET 數據網關 使用 Skyvia Co
    的頭像 發表于 01-02 09:31 ?107次閱讀
    <b class='flag-5'>通過</b>Skyvia Connect <b class='flag-5'>SQL</b>終端節點訪問任何數據

    淺談SQL優化小技巧

    存儲在緩存中的數據; (3)未命中緩存后,MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的解析樹,MySQL解析器將使用MySQL語法進行驗證和解析。 例如,驗證是否使用了錯誤的關鍵字,或者關鍵字的使用是否正確; (4)預處理是根據一些MySQL規則檢查解析樹
    的頭像 發表于 12-25 09:59 ?548次閱讀

    SQL錯誤代碼及解決方案

    SQL數據庫開發和管理中,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在錯誤消息中明確指出是語法錯誤。 原因 :SQL語句
    的頭像 發表于 11-19 10:21 ?2725次閱讀

    常用SQL函數及其用法

    SQL 函數及其用法: 一、聚合函數(Aggregate Functions) 聚合函數對一組值執行計算,并返回單個值。 COUNT() 用途 :返回匹配指定條件的行數。 示例 : SELECT
    的頭像 發表于 11-19 10:18 ?407次閱讀

    SQL與NoSQL的區別

    景。 SQL數據庫 SQL數據庫,也稱為關系型數據庫管理系統(RDBMS),是一種基于關系模型的數據庫。它使用表格、行和列來組織數據,并通過SQL語言進行數據的查詢和管理。 特點 結構
    的頭像 發表于 11-19 10:15 ?216次閱讀

    大數據從業者必知必會的Hive SQL調優技巧

    不盡人意。本文針對Hive SQL的性能優化進行深入研究,提出了一系列可行的調優方案,并給出了相應的優化案例和優化前后的SQL代碼。通過合理的優化策略和技巧,能夠顯著提升Hive SQL
    的頭像 發表于 09-24 13:30 ?313次閱讀

    數據庫數據恢復—SQL Server數據庫出現823錯誤的數據恢復案例

    SQL Server數據庫故障: SQL Server附加數據庫出現錯誤823,附加數據庫失敗。數據庫沒有備份,無法通過備份恢復數據庫。 SQL Server數據庫出現823錯誤的
    的頭像 發表于 09-20 11:46 ?391次閱讀
    數據庫數據恢復—<b class='flag-5'>SQL</b> Server數據庫出現823錯誤的數據恢復案例

    IP 地址在 SQL 注入攻擊中的作用及防范策略

    SQL 注入是通過將惡意的 SQL 代碼插入到輸入參數中,欺騙應用程序執行這些惡意代碼,從而實現對數據庫的非法操作。例如,在一個登錄表單中,如果輸入的用戶名被直接拼接到 SQL 查詢
    的頭像 發表于 08-05 17:36 ?354次閱讀

    恒訊科技分析:sql數據庫怎么用?

    。 2、安裝數據庫軟件: 在您的服務器或本地計算機上安裝所選的數據庫軟件。 3、配置數據庫服務器: 根據需要配置數據庫服務器設置,包括內存分配、存儲位置、網絡配置等。 4、創建數據庫: 使用SQL命令或數據庫管理工具創建一個新的數據庫實例。 5、設計數據庫模式: 設計數據
    的頭像 發表于 07-15 14:40 ?399次閱讀

    什么是 Flink SQL 解決不了的問題?

    簡介 在實時數據開發過程中,大家經常會用 Flink SQL 或者 Flink DataStream API 來做數據加工。通常情況下選用2者都能加工出想要的數據,但是總會有 Flink SQL
    的頭像 發表于 07-09 20:50 ?362次閱讀

    甲骨文發布AI編程助手,助用戶編寫Java、SQL程序

    據悉,Oracle Code Assist基于甲骨文先進的云計算平臺——Oracle Cloud Infrastructure (OCI)構建,重點優化各項Java、SQL程序以及OCI應用開發環節。
    的頭像 發表于 05-13 10:19 ?613次閱讀

    SQL全外連接剖析

    SQL中的全外連接是什么? 在SQL中,FULLOUTERJOIN組合左外連接和右外連接的結果,并返回連接子句兩側表中的所有(匹配或不匹配)行。接下面sojson給大家詳細講解。 ? 圖解:SQL
    的頭像 發表于 03-19 18:28 ?2289次閱讀
    <b class='flag-5'>SQL</b>全外連接剖析

    為什么需要監控SQL服務器?

    服務器是存儲、處理和管理數據的關系數據庫管理系統 (RDBMS) 工具或軟件,例如Microsoft的MSSQL、Oracle DB和PostgreSQL。此外,服務器執行SQL查詢和命令來操作關系數據庫。實際上,SQL服務器將托管數據庫和
    的頭像 發表于 02-19 17:19 ?509次閱讀
    主站蜘蛛池模板: 美女直播喷水 | 甜性涩爱下载 | 老牛天天晚上夜噜噜噜 | 久久噜国产精品拍拍拍拍 | 亚洲精品一线二线三线无人区 | 娇妻归来在线观看免费完整版电影 | 亚洲第一区欧美日韩精品 | 99久久国语露脸精品国产 | 黄梅戏mp3大全 | 亚洲精品成人a在线观看 | 自慰弄湿白丝袜 | 亚洲视频黄 | 高清 国产 在线 亚洲 | 一个人免费观看在线视频播放 | 性生大片免费看 | 亚洲 欧美 制服 校园 动漫 | 欧美精品久久久久性色AV苍井 | 最近中文字幕2019免费版日本 | 99国产这里只有精品视频 | 午夜剧场1000 | 亚久久伊人精品青青草原2020 | 欧美亚洲综合另类无码 | 亚洲一区免费观看 | 恋夜直播午夜秀场最新 | 精品国产成人AV在线看 | 国产成人午夜精品免费视频 | 三级在线观看网站 | 东北疯狂xxxxbbbb中国 | 久久精品亚洲国产AV涩情 | 国产免费人成在线看视频 | 偷窥自拍性综合图区 | 国产精品亚洲国产三区 | 无码中文字幕热热久久 | 99久视频只有精品2019 | 伊人不卡久久大香线蕉综合影院 | 性一交一无一伦一精一品 | 亚洲欧美综合中文 | 美女扒开腿让男生桶爽免费APP | 99视频导航 | 大屁股国产白浆一二区 | 久久精品久久精品 |