在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    7246

    瀏覽量

    91241
  • SQL
    SQL
    +關注

    關注

    1

    文章

    781

    瀏覽量

    44863

原文標題:3 小結

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何一眼定位SQL的代碼來源:一款SQL染色標記的簡易MyBatis插件

    侵入,接入簡單,支持SELECT、INSERT、UPDATE、DELETE等語句,同時也支持無WHERE條件SQL的標記增強。該SQL染色插件并不改變SQL指紋,染色信息內置了stat
    的頭像 發表于 03-05 11:36 ?365次閱讀
    如何一眼定位<b class='flag-5'>SQL</b>的代碼來源:一款<b class='flag-5'>SQL</b>染色標記的簡易MyBatis插件

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

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

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

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

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

    通過 Skyvia Connect SQL 終端節點訪問任何數據 ? 通過 Skyvia Connect SQL 終端節點訪問任何數據ADO.NET 數據網關 使用 Skyvia Co
    的頭像 發表于 01-02 09:31 ?322次閱讀
    <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 ?803次閱讀

    SQL錯誤代碼及解決方案

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

    常用SQL函數及其用法

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

    SQL與NoSQL的區別

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

    KM振動在線監測系統助力設備煥新升級#振動在線監測#振動監測#在線監測

    在線監測
    KM預測性維護專家
    發布于 :2024年10月23日 14:59:48

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

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

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

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

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

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

    如何在SQL中創建觸發器

    SQL中,觸發器(Trigger)是一種特殊類型的存儲過程,它自動執行或激活響應表上的數據修改事件(如INSERT、UPDATE、DELETE等)。觸發器可以用于維護數據庫的完整性、自動化復雜
    的頭像 發表于 07-18 16:01 ?3313次閱讀

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

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

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

    簡介 在實時數據開發過程中,大家經常會用 Flink SQL 或者 Flink DataStream API 來做數據加工。通常情況下選用2者都能加工出想要的數據,但是總會有 Flink SQL
    的頭像 發表于 07-09 20:50 ?546次閱讀
    主站蜘蛛池模板: 操操片| 老色批影院 | 欧美性白人极品1819hd | 天天躁日日躁狠狠躁中文字幕老牛 | 天堂资源最新版在线官网 | 曰本裸色私人影院噜噜噜影院 | 欧美色影视 | 一级欧美视频 | 久久免 | 亚欧美综合 | 一区二区三区免费在线 | 97影院午夜午夜伦不卡 | 艹久久| 456性欧美欧美在线视频 | 夜夜爱夜夜爽夜夜做夜夜欢 | 男人边吃奶边爱边做视频日韩 | 欧美猛交xxxx免费看 | 天天做天天爱天天影视综合 | 国产精品嫩草影院人体模特 | 国产成人影视 | 欧美午夜在线观看 | 4438x成人网最大色成网站 | 色视频国产 | 三级黄网站 | 天天看片国产 | 国产一卡二卡3卡4卡四卡在线 | 好爽好深太大了再快一点 | 四虎影院最新网站 | 久久国产成人午夜aⅴ影院 久久国产福利 | 国产精品久久久久影视不卡 | 日本黄色小说视频 | 日本一卡二卡3卡四卡网站精品 | 国产色司机在线视频免费观看 | 中文字幕成人乱码在线电影 | 免费人成年短视频在线观看免费网站 | 手机在线你懂得 | 国产伦精品一区二区三区在线观看 | 国产三级精品三级 | 成人性色生活片免费看爆迷你毛片 | 五月天婷婷基地 | 日韩亚洲人成在线综合 |