2017-04-03 53 views
0

我有一個數據庫,其中包含來自同一產品的不同供應商的價格。每個供應商/產品組合有一個開始&結束日期與產品ID和價格SQL - 根據日期範圍獲取最低價格

id | pid | aid | start_date | end_date | price 
1 | 1 | 1 | 2017-01-01 | 2017-01-10 | 10.00 
1 | 1 | 2 | 2017-01-01 | 2017-01-05 | 12.00 
1 | 1 | 2 | 2017-01-06 | 2017-01-09 | 9.00 

我使用日曆表,以確保我有在一定範圍內的所有日期。 我的掙扎是選擇某個日期範圍內的最低價格。上述數據應輸出如下。

date  | aid | price 
2017-01-01 | 1 | 10.00 
2017-01-02 | 1 | 10.00 
2017-01-03 | 1 | 10.00 
2017-01-04 | 1 | 10.00 
2017-01-05 | 1 | 10.00 
2017-01-06 | 2 | 9.00 
2017-01-07 | 2 | 9.00 
2017-01-08 | 2 | 9.00 
2017-01-09 | 2 | 9.00 
2017-01-10 | 1 | 10.00 

只要有一個供應商,並獲得價格不是問題,但只要我開始對數據進行分組我只得到一個結果或不正確的結果。 我正在使用此查詢,它提供了錯誤的結果。

SELECT 
    c.date, min(p.price) as min_price 
FROM 
    bricks_calender c 
LEFT JOIN 
    bricks_prijzen p ON c.date BETWEEN p.start_date AND p.end_date 
WHERE 
    p.pid = 1 
GROUP BY 
    aid 
ORDER BY 
    c.date 

任何建議,我需要更新此查詢,以獲得預期的結果?或者我應該改變我的數據模型(這當然不是首選)

+0

使用GROUP BY援助和日期 –

+0

@RavinderReddy分組由'aid'和'date'會給結果正好等於日曆表,因爲他的日期完全不同 – sadmicrowave

+0

@Ralf,你能否提供你所收到的查詢作爲「錯誤」的輸出? – sadmicrowave

回答

1

如果bricks_calender包含每個日期一行,後續應該工作:

SELECT 
    c.`date`, 
    (select s.`aid` from `bricks_prijzen` s where s.`price` = min(p.`price`) and c.`date` BETWEEN s.`start_date` AND s.`end_date` ORDER BY s.`price` ASC LIMIT 0,1) AS `aid`, 
    min(p.`price`) as `min_price` 
FROM `bricks_calender` c 
LEFT JOIN `bricks_prijzen` p 
    ON c.`date` BETWEEN p.`start_date` AND p.`end_date` 
WHERE 
    p.`pid` = 1 
GROUP BY 
    c.`date` 
ORDER BY 
    c.`date`; 
+0

感謝您的建議。有兩個問題,表bricks_prijzen中不存在s.date字段。該表格包含開始和結束日期字段。將節「s.'date' = c.'date'」更改爲「s.start_date和s.end_date之間的c.date」我收到一條錯誤消息'comments out of sync'。任何其他建議如何解決這個問題? – Ralf

+0

我更新了代碼。對於那個很抱歉。我應該第一次瞭解到這一點。至於錯誤消息,你確定它是「_comments_不同步」而不是「_commands_不同步」? –

+0

@Ralf:我創建了一個SQL小提琴來測試語句:http://sqlfiddle.com/#!9/2a220/2/0 –

0

我認爲這只是因爲你將數據分組通過aidGROUP BY aid,所以你不能比存在不同aid數量多行。

通過取消設置此GROUP BY,它解決了問題嗎?