SQL笛卡尔积结合前后行数据的统计案例
生活随笔
收集整理的這篇文章主要介紹了
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笛卡尔积结合前后行数据的统计案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4009935398是不是快贷
- 下一篇: 只有装入自己大脑的财富,才不会亏损,谨防