Session重疊問題學習(一)
MySQL技術內幕 SQL
2.4 Session重疊問題
實驗資料初始化:
標記重疊的書中原文:
標示重疊是指為每個會話標示出相同應用程式和使用者重疊的會話,即對於每個會話,標示出其內部的所有會話情況。
例如,app1、user1這個會話在08:30~10:30時間段內有3次重疊的會話:08:30~10:30、09:00~09:30和09:15~09:30。
對於這個問題,下面是完整的SQL解決方案:
<b.starttime<b.endtime<a.endtime
分組重疊
還有一個問題是服務提供商可能允許多個session的連線,並把其計費統計為1次,這就是所謂的分組重疊。對於上面的例子,應該把app1、user1在08:30~10:30間的3次會話算為一次會話。
我們分步驟來討論這個問題,先求出每個會話組開始時間,並用DISTINCT返回不重複的開始時間,具體過程如下:
用同樣的方法得到會話組結束的時間,具體過程如下:
最後只需把兩張表合併,並透過MIN函式取得結束的時間。完整的SQL解決方案如下面的程式碼所示:
</b.starttime<b.endtime<a.endtime
2.4 Session重疊問題
實驗資料初始化:
- CREATE TABLE sessions (
- id INT AUTO_INCREMENT NOT NULL,
- app VARCHAR(10) NOT NULL,
- usr VARCHAR(10) NOT NULL,
- starttime TIME NOT NULL,
- endtime TIME NOT NULL,
- KEY (id)
- );
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user1', '08:30', '10:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user2', '08:30', '08:45');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user1', '09:00', '09:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user2', '09:15', '10:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user1', '09:15', '09:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user2', '10:30', '14:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user1', '10:45', '11:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app1', 'user2', '11:00', '12:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user1', '08:30', '08:45');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user2', '09:00', '09:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user1', '11:45', '12:00');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user2', '12:30', '14:00');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user1', '12:45', '13:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user2', '13:00', '14:00');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user1', '14:00', '16:30');
- INSERT INTO sessions(app, usr, starttime, endtime)
- VALUES('app2', 'user2', '15:30', '17:00');
- CREATE UNIQUE INDEX idx_app_usr_s_e_key
- ON sessions(app, usr, starttime, endtime, id);
- CREATE INDEX idx_app_s_e ON sessions(app, starttime, endtime);
標記重疊的書中原文:
標示重疊是指為每個會話標示出相同應用程式和使用者重疊的會話,即對於每個會話,標示出其內部的所有會話情況。
例如,app1、user1這個會話在08:30~10:30時間段內有3次重疊的會話:08:30~10:30、09:00~09:30和09:15~09:30。
對於這個問題,下面是完整的SQL解決方案:
- SELECT a.app, a.usr, a.starttime, a.endtime, b.starttime
- , b.endtime
- FROM sessions a, sessions b
- WHERE a.app = b.app
- AND a.usr = b.usr
- AND (b.endtime >= a.starttime
- AND b.starttime <= a.endtime)
<b.starttime<b.endtime<a.endtime
分組重疊
還有一個問題是服務提供商可能允許多個session的連線,並把其計費統計為1次,這就是所謂的分組重疊。對於上面的例子,應該把app1、user1在08:30~10:30間的3次會話算為一次會話。
我們分步驟來討論這個問題,先求出每個會話組開始時間,並用DISTINCT返回不重複的開始時間,具體過程如下:
- SELECT DISTINCT app, usr, starttime AS s
- FROM sessions a
- WHERE NOT EXISTS (SELECT *
- FROM sessions b
- WHERE a.app = b.app
- AND a.usr = b.usr
- AND a.starttime > b.starttime
- AND a.starttime <= b.endtime)
用同樣的方法得到會話組結束的時間,具體過程如下:
- SELECT DISTINCT app, usr, endtime AS e
- FROM sessions a
- WHERE NOT EXISTS (SELECT *
- FROM sessions b
- WHERE a.app = b.app
- AND a.usr = b.usr
- AND a.endtime >= b.starttime
- AND a.endtime < b.endtime)
最後只需把兩張表合併,並透過MIN函式取得結束的時間。完整的SQL解決方案如下面的程式碼所示:
- SELECT DISTINCT s.app, s.usr, s.s, (
- SELECT MIN(e)
- FROM (SELECT DISTINCT app, usr, endtime AS e
- FROM sessions a
- WHERE NOT EXISTS (SELECT *
- FROM sessions b
- WHERE a.app = b.app
- AND a.usr = b.usr
- AND a.endtime >= b.starttime
- AND a.endtime < b.endtime)
- ) s2
- WHERE s2.e > s.s
- AND s.app = s2.app
- AND s.usr = s2.usr
- ) AS e
- FROM (SELECT DISTINCT app, usr, starttime AS s
- FROM sessions a
- WHERE NOT EXISTS (SELECT *
- FROM sessions b
- WHERE a.app = b.app
- AND a.usr = b.usr
- AND a.starttime > b.starttime
- AND a.starttime <= b.endtime)
- ) s, (SELECT DISTINCT app, usr, endtime AS e
- FROM sessions a
- WHERE NOT EXISTS (SELECT *
- FROM sessions b
- WHERE a.app = b.app
- AND a.usr = b.usr
- AND a.endtime >= b.starttime
- AND a.endtime < b.endtime)
- ) e
- WHERE s.app = e.app
- AND s.usr = e.usr
</b.starttime<b.endtime<a.endtime
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1869550/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Session重疊問題學習(三)--優化Session優化
- Session重疊問題學習(五)--最優化Session優化
- Session重疊問題學習(四)--再優化Session優化
- Session重疊問題學習(六)--極致優化Session優化
- Session重疊問題學習(八)--該問題第六次優化和Oracle版本Session優化Oracle
- Session重疊問題學習(七)--小花狸合併演算法和最後一次優化Session演算法優化
- Session重疊問題學習(九)--該問題第七次優化.優化合並演算法Session優化演算法
- 【OpenCV學習】計算兩幅影象的重疊區域OpenCV
- Session一致性問題Session
- 如何避開jquery動態繫結的事件重疊問題jQuery事件
- session共享問題???Session
- Fragment重影(重疊)白屏等問題原理解析,以及解決方案Fragment
- Android 百度地圖InfoWindow 出現重疊的問題Android地圖
- react 學習 問題React
- session的存取問題Session
- kill session的學問Session
- thinkphp session 管理函式的一個問題PHPSession函式
- process/session/connection的一些問題Session
- SceneKit-解決模型重疊時渲染畫面閃爍的問題模型
- 關於Oracle10g JOB執行是否會重疊的問題Oracle
- 一本組合學習題集——《組合問題與練習》
- Spark學習——問題排查Spark
- 學習方向的問題
- 面經問題學習
- 基礎學習問題
- 關於學習效率問題,一點點心得
- 一生一芯預學習1 | 如何科學的提問(解決問題)
- Web--Session共享問題WebSession
- Tomcat 共享session問題TomcatSession
- 關於session的問題Session
- Hibernate的session問題Session
- Session的過期問題Session
- (合併 重疊陣列)練習容器的用法陣列
- Java學習--Cookie 和sessionJavaCookieSession
- ASP.NET一般處理程式訪問Session問題ASP.NETSession
- 解答關於學習前端的一些問題前端
- JERSEY學習遇到的問題
- mysql學習整理所有問題MySql