日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

SQL笛卡尔积结合前后行数据的统计案例

發(fā)布時間:2024/9/27 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL笛卡尔积结合前后行数据的统计案例 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SQL前后3天統(tǒng)計分析

問題描述

為什么這段mysql語句能夠?qū)崿F(xiàn)如下功能?

?某市建了一個新的體育館,每日人流量信息被記錄在gymnasium表中:序號 (id)、日期 (date)、 人流量 (visitors_flow)。

請編寫一個查詢語句,找出人流量處于高峰的記錄 id、日期 date 和人流量 visitors_flow,其中高峰定義為前后連續(xù)三天人流量均不少于 100。

gymnasium表結(jié)構(gòu)數(shù)據(jù)如下:

?提示:每天只有一行記錄,日期隨著?id?的增加而增加。

如上文所示,我的疑問在于既然a,b,c都是一個表的同一個別名,那么where a.visitors_flow>=100 and b.visitors_flow>=100 and c.visitors_flow>=100不就重復了嗎?同時,a.id與b.id與c.id不是都相同嗎?剛?cè)腴T,感謝賜教。

?解決方法

--#1 需求描述:前后連續(xù)三天人流量均不少于 100。 /* SQL轉(zhuǎn)換: 找出表里流量大于100的記錄且每條(天)的前后都有數(shù)據(jù),即都能關聯(lián)上。 思路演化: 需要通過笛卡爾積生成3張“表”(每張表的visitors_flow>=100),前后連續(xù)3天通過id(id是連續(xù)的)關聯(lián)。 */ --#2 表與數(shù)據(jù) CREATE TABLE gymnasium ( id int, date DATE, visitors_flow SMALLINT )TRUNCATE TABLE gymnasium; INSERT INTO gymnasium VALUES(1,'2019-01-01',58); INSERT INTO gymnasium VALUES(2,'2019-01-02',110); INSERT INTO gymnasium VALUES(3,'2019-01-03',123); INSERT INTO gymnasium VALUES(4,'2019-01-04',67); INSERT INTO gymnasium VALUES(5,'2019-01-05',168); INSERT INTO gymnasium VALUES(6,'2019-01-06',1352); INSERT INTO gymnasium VALUES(7,'2019-01-07',382); INSERT INTO gymnasium VALUES(8,'2019-01-08',326); INSERT INTO gymnasium VALUES(9,'2019-01-09',99); INSERT INTO gymnasium VALUES(10,'2019-01-10',73); INSERT INTO gymnasium VALUES(11,'2019-01-11',65); INSERT INTO gymnasium VALUES(12,'2019-01-12',123); INSERT INTO gymnasium VALUES(13,'2019-01-13',28); --#3 當前SQL解釋: /* 從同一個表“visitors_flow>=100”里取得結(jié)果集確實是相同的,加上條件“a.id = b.id-1 and b.id= c.id -1”時篩選了前后連續(xù)3天。 注:a.visitors_flow>=100需要在篩選連續(xù)3天時加上,而不是在外部。外部的要求更嚴格,內(nèi)部的僅要求局部連續(xù)3天。 外部的要求更嚴格(適合連續(xù)前后3天訪問量大于100),內(nèi)部的僅要求局部連續(xù)3天。 */--#4 正確寫法: # Way1 select DISTINCT a.* from gymnasium a,gymnasium as b,gymnasium as c where -- (a.visitors_flow>=100 AND b.visitors_flow >=100 AND c.visitors_flow >=100) -- and ( (a.id = b.id-1 and b.id= c.id -1 AND a.visitors_flow>=100) or (a.id = b.id-1 and a.id=c.id -1 AND a.visitors_flow >=100 ) or (a.id = b.id+1 and b.id= c.id AND a.visitors_flow >=100) order by a.id; -- 注:該結(jié)果出來的日期間隔可能超過3。--#Way2 通過相鄰函數(shù)lag(前N行),MYSQL8、SQL Server、Oracle都支持。SELECT pre_id1,pre_date1,pre_1 as visitors_flow FROM ( SELECT *, lag(visitors_flow,1)over(order by id) pre_1, lag(date,1)over(order by id) pre_date1, lag(id,1)over(order by id) pre_id1, lag(visitors_flow,2)over(order by id) pre_2 FROM gymnasium )A WHERE pre_1>=100-- 注:這里取的是有前和后的,第一行和最后一行未包含。 --#5 結(jié)果

執(zhí)行結(jié)果

總結(jié)

以上是生活随笔為你收集整理的SQL笛卡尔积结合前后行数据的统计案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。