2016-05-12 131 views
1

最後一排我有一個包含一個表: 平衡,CLIENT_ID,日期SQL - 獲取日期範圍

這個表有〜25萬行 - 大多數時候,一個服務執行,併爲每個客戶端創建一個新的行,與今天的日期和客戶的平衡。

在日期範圍內,可以說2016年1月1日至2016年5月12日,我需要得到第一行和最後一行。

*該服務不會每天運行,因此日期= 12/05/2016將不起作用。如果今天的餘額等於昨天的餘額,則不插入行(節省了我約90%的數據,如果我正確計算,應該是3億行)

爲此,我運行這兩個查詢: 獲得第一個日期:6.9433851242065 seconds

SELECT * FROM (SELECT * FROM daily 
      WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016') dates 
GROUP BY Client_ID 

獲得最後日期:32.034277915955 seconds

SELECT * FROM (SELECT * FROM daily 
      WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016' 
      ORDER BY Date DESC) dates 
GROUP BY Client_ID 

第一個查詢沒有訂單,因爲行以正確的順序總是插入,通過上述服務 - 和成功h要快得多。 (7/32)

如何使兩個查詢更快,或者至少是第二個?

查詢說明:

  • 獲取行其中的日期爲2016年1月1日之後
  • 第一次約會獲取行其中的日期爲13/05/2016
  • 之前的最後日期

編輯:檢查答案給了我下面的:

ASC和DESC是我的,「組合拳」是建議的答案


  • dates_ASC:33.300458192825

  • dates_DESC:8.9232740402222

  • dates_combined:8.4357199668884


  • dates_ASC:5.4825110435486

  • dates_DESC:10.173403978348

  • dates_combined:2.7024359703064


  • dates_ASC:15。090759038925
  • dates_DESC:29.375104904175
  • dates_combined:3.2885720729828
+0

首先,你確定你需要的嵌套的SELECT?你確定你需要所有返回的字段嗎?另外,我會嘗試'SELECT TOP 1 *'。 –

+0

爲什麼不使用'ORDER BY ASC LIMIT 1'? – C14L

+0

哦,MySQL,是的。 LIMIT 1而不是SELECT TOP 1. –

回答

1

接每個客戶的最小和最大時間在派生表。與表加入:

select * 
from daily d1 
    join (select Client_ID, max(TIME) as maxtime, min(TIME) as mintime 
     from daily 
     WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016' 
     group by Client_ID) d2 
on d1.Client_ID = d2.Client_ID and d1.TIME in (d2.mintime, d2.maxtime) 
+0

這看起來不錯。我更深入地檢查它 – Amit

+0

謝謝,這完美的作品。結果在編輯後 - 檢查出來 – Amit

0

嘗試第一個查詢爲:

SELECT * FROM daily WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016' ORDER BY TIME ASC LIMIT 1 

第二個查詢爲:

SELECT * FROM daily WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016' ORDER BY TIME DESC LIMIT 1