簡體   English   中英

比較停車收費表交易與歷史數據

[英]Compare parking meter transactions with historical data

我已經從停車收費表中獲取了實時數據,並想將停車收費表的當前狀態與歷史數據進行比較。 我的數據包含購買時的停車票和datetime_start,以及不再有用時的datetime_stop。

該SQL實際可行,但速度很慢。 我想我會以某種方式遍歷所有數據很多次,或者可以優化其他一些事情:

(SELECT "parking_meter_id", SUM(CASE WHEN Now() BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) < ( 
SUM(CASE WHEN Now() - interval '1 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '2 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '3 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '4 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '5 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '6 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '7 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) + 
SUM(CASE WHEN Now() - interval '8 week' BETWEEN "datetime_start" AND "datetime_stop" THEN 1 ELSE 0 END) 
/ 8) AS available 
FROM "parking_meter_transactions" 
WHERE 
Now() BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '1 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '2 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '3 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '4 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '5 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '6 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '7 week' BETWEEN "datetime_start" AND "datetime_stop" OR 
Now() - interval '8 week' BETWEEN "datetime_start" AND "datetime_stop" 
GROUP BY "parking_meter_id") AS transactions 

基本思想是計算截至now()為止“合法”的機票數量,並將其與一天中同一時間的最近8周的數量進行比較。 這樣可以統計出是否應該有一個可用的停車位。

我建議根據以下內容為您的查詢建立覆蓋索引

( datetime_start, datetime_stop, parking_meter_id )

這樣,數據庫不必去原始數據頁面即可完成查詢。

另外,將您的WHERE子句調整為非常簡單的單個日期比較范圍。 是的,在您的SUM(case)塊中,您需要區分適用的星期,但是您的WHERE子句可以簡化為

WHERE datetime_start > Now() - interval '2 months'

想想看...您的“ NOW()”調用就是它...咧嘴笑着,假設1月13日@ 12:00 AM。 因為您所有的WHERE子句都在一起“或”

Now - 2 months = Week of Nov 13
Now - 2 months - 1 week = Week of Nov 20
Now - 2 months - 2 weeks = Week of Nov 27
...
Now - 2 months - 8 weeks = Brings us back to Now...  

因此,您的NET時間段是開始日期/時間大於2個月前的任何時間。

就是說,建議的索引應該可以顯着提高性能。 查看WHERE子句的復雜性,它必須不斷計算日期-各個時間間隔。 由於它不能有效地利用索引,因此可能會令人窒息。

在索引中包含儀表ID將有助於優化GROUP BY子句。

每個評論的反饋。

您所有的約會都在FARTHEST的now()-2個月內完成。 在此之前不要考慮任何事情……但是現在我看到了額外的WHERE子句,您希望如何只希望在8周的每周時間內及時獲得特定的“ NOW()”門票。 因此,where子句仍僅在單個條件下有效。

讓引擎從該日期/時間開始遍歷所有記錄,而無需應用復雜的WHERE條件。 請記住,您通過SUM(CASE / WHEN)進行的列選擇僅會基於相關時間段內的那些“ Legel”來計算。

SUM(CASE WHEN Now()-在“ datetime_start”和“ datetime_stop”之間的間隔“ 1周”,然后1否則0結束)+ SUM(CASE WHEN Now()-在“ datetime_start”和“ datetime_stop”之間的間隔“ 2周”,然后1 ELSE 0 END)+

因此,如果您正在尋找下午2:53之類的東西,並且在datetime_start 7:59 pm擁有1月2日的合格WHERE子句記錄,它將使所有CASE / WHEN實例失敗,並且結果列中的NONE都將失敗將1添加到它們,因此忽略它們。

因此,即使過去兩個月有1萬條記錄,也可以通過索引快速瀏覽它們。 您的案子/時間僅可以計算特定於您正在尋找的2:53(ex :)時間段的事件,並且可能在整個星期內僅得出314個條目的計數。

   Wed, Jan 14 @ 2:53
   Wed, Jan  7 @ 2:53
   Wed, Dec 31 @ 2:53
   Wed, Dec 24 @ 2:53
   Wed, Dec 17 @ 2:53
   Wed, Dec 10 @ 2:53
   Wed, Dec 3 @ 2:53
   Wed, Nov 26 @ 2:53
   Wed, Nov 19 @ 2:53

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM