日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

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

SQL前后3天統計分析

問題描述

為什么這段mysql語句能夠實現如下功能?

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

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

gymnasium表結構數據如下:

?提示:每天只有一行記錄,日期隨著?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不是都相同嗎?剛入門,感謝賜教。

?解決方法

--#1 需求描述:前后連續三天人流量均不少于 100。 /* SQL轉換: 找出表里流量大于100的記錄且每條(天)的前后都有數據,即都能關聯上。 思路演化: 需要通過笛卡爾積生成3張“表”(每張表的visitors_flow>=100),前后連續3天通過id(id是連續的)關聯。 */ --#2 表與數據 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”里取得結果集確實是相同的,加上條件“a.id = b.id-1 and b.id= c.id -1”時篩選了前后連續3天。 注:a.visitors_flow>=100需要在篩選連續3天時加上,而不是在外部。外部的要求更嚴格,內部的僅要求局部連續3天。 外部的要求更嚴格(適合連續前后3天訪問量大于100),內部的僅要求局部連續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; -- 注:該結果出來的日期間隔可能超過3。--#Way2 通過相鄰函數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 結果

執行結果

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。