2017-12-18 210 views
1

我不是很喜歡數據庫,我發現一些問題試圖修改在MySql上定義的查詢。如何使用SQL在此特定情況下只檢索與日期字段的最後一個值相關的記錄?

我有這個疑問這是我的出發Poing的(有需要修改的查詢):

SELECT 
    MC_PS.id           AS price_series_id, 
    MC_PS.market_commodity_details_id     AS market_commodity_details_id, 
    MC_PS.price_date         AS price_date, 
    MC_PS.avg_price          AS avg_price, 
    CU.ISO_4217_cod          AS currency, 
    MU.unit_name          AS measure_unit, 
    MD_CD.market_details_id        AS market_id, 
    MD_CD.commodity_details_id       AS commodity_id 

    FROM Market_Commodity_Price_Series AS MC_PS 

    INNER JOIN MeasureUnit AS MU 
     ON MC_PS.measure_unit_id = MU.id 

    INNER JOIN Currency AS CU 
     ON MC_PS.currency_id = CU.id 

    INNER JOIN MarketDetails_CommodityDetails AS MD_CD 
      ON MC_PS.market_commodity_details_id = MD_CD.id 

該查詢返回在某些市場上一些商品的價格,這是查詢輸出:

price_series_id  market_commodity_details_id price_date  avg_price   currency measure_unit  market_id   commodity_id   
----------------------------------------------------------------------------------------------------------------------------------------------------- 
17     25       18/12/2017  778     RWF  kilogram   4     6     
70     32       17/12/2017  5     RWF  kilogram   6     16     
71     32       18/12/2017  6     RWF  kilogram   6     16     
3     26       15/12/2017  12,84    XOF  kilogram   4     8     
4     25       15/12/2017  18,233    XOF  kilogram   4     6     
5     25       16/12/2017  22,84    XOF  kilogram   4     6     
6     24       16/12/2017  18,94    XOF  kilogram   4     4     
7     24       17/12/2017  28,63    XOF  kilogram   4     4     
9     26       18/12/2017  48,37    XOF  kilogram   4     8     
11     24       18/12/2017  33,33    XOF  kilogram   4     4     
18     28       18/12/2017  13,7     XOF  kilogram   5     4     
19     28       17/12/2017  16,2     XOF  kilogram   5     4     
20     28       16/12/2017  14,9     XOF  kilogram   5     4     
21     30       18/12/2017  21,47    XOF  kilogram   5     3     
22     30       16/12/2017  22,39    XOF  kilogram   5     3     
23     30       17/12/2017  23,17    XOF  kilogram   5     3     
24     26       17/12/2017  16,22    XOF  kilogram   4     8     
26     26       16/12/2017  19,39    XOF  kilogram   4     8     
27     31       18/12/2017  13,2     XOF  kilogram   5     8     
28     31       17/12/2017  14,4     XOF  kilogram   5     8     
29     31       16/12/2017  12,6     XOF  kilogram   5     8     
31     25       17/12/2017  17,8     XOF  kilogram   4     6     
32     25       17/12/2017  14,8     XOF  kilogram   4     6     
33     29       18/12/2017  8,2     XOF  kilogram   5     1     
34     29       17/12/2017  9,6     XOF  kilogram   5     1     
35     29       16/12/2017  9,3     XOF  kilogram   5     1     

正如你可以看到它包含了商品(commodity_id)出售到某一天市場(market_id)的價格(price_date)。

我需要修改我的查詢,只顯示在市場上出售的商品的最後價格。

實際上,如果在前面的結果中有多個記錄與特定市場上銷售的特定商品有關的不同日期有關,則必須在最後日期返回單個記錄。

所以我修改查詢的輸出必須是這樣的一個:

price_series_id  market_commodity_details_id price_date  avg_price   currency measure_unit  market_id   commodity_id   
-----------------------------------------------------------------------------------------------------------------------------------------------------    
71     32       18/12/2017  6     RWF  kilogram   6     16         
9     26       18/12/2017  48,37    XOF  kilogram   4     8     
11     24       18/12/2017  33,33    XOF  kilogram   4     4     
18     28       18/12/2017  13,7     XOF  kilogram   5     4          
21     30       18/12/2017  21,47    XOF  kilogram   5     3              
27     31       18/12/2017  13,2     XOF  kilogram   5     8         
17     25       18/12/2017  778     RWF  kilogram   4     6     
33     29       18/12/2017  8,2     XOF  kilogram   5     1     

正如你可以看到每個market_idcommodity_id字段只檢索有關最後記錄price_date value

如何正確實施此更改?

也許我可以用GROUP BYHAVING子句以某種方式?

回答

2

你的Market_Commodity_Price_Series表有一個自動增量的id列嗎?您的應用程序是否始終使用INSERT新行,並將最近的price_date值納入其中?

如果是這樣,你可以在WHERE子句如下

WHERE MC_PS.id IN (SELECT MAX(id) id 
         FROM Market_Commodity_Price_Series 
         GROUP BY market_commodity_details_id) 

這將過濾掉所有,但每個項目的最高值id添加到您的查詢。如果假設是真實的,那也將是最新的價值。

如果這些假設不成立,您可以使用類似的過濾器,但它更難。要獲得每個項目的最新id值你這樣做:

  SELECT a.id 
      FROM Market_Commodity_Price_Series a 
      JOIN (
        SELECT MAX(price_date) price_date, 
          market_commodity_details_id 
         FROM Market_Commodity_Price_Series 
         GROUP BY market_commodity_details_id 
       ) b ON a.market_commodity_details_id = b.market_commodity_details_id 
        AND a.price_date = b.price_date 

這個查詢看你的表,發現每個項目的最新日期。然後它恢復該項目的id值。然後,您可以在WHERE id IN()子句中使用整個子查詢,如上所示。

+0

我改變了我的downvote upvote。使用O Jones第二個解決方案。第一個是不是一個好主意 – ojf

+0

第二個解決方案對我來說聽起來不錯;-) – AndreaNobili

+0

如果前提條件成立(自動增量ID,沒有更新,只有INSERT和每個插入使用當前日期,我的第一個解決方案是正確的,並執行非常儘管如此,還是有相反的意見。它也正確地消除了重複的最新日期值,如果有多個。 –

0

瓊斯的第一個想法不是一個好主意。使用子查詢獲取最新日期的記錄並加入到該記錄中。這是未經測試,但看看最後的加入

SELECT 
    MC_PS.id           AS price_series_id, 
    MC_PS.market_commodity_details_id     AS  market_commodity_details_id, 
    MC_PS.price_date         AS price_date, 
    MC_PS.avg_price          AS avg_price, 
    CU.ISO_4217_cod          AS currency, 
    MU.unit_name          AS measure_unit, 
    MD_CD.market_details_id        AS market_id, 
    MD_CD.commodity_details_id       AS commodity_id 

FROM Market_Commodity_Price_Series AS MC_PS 

INNER JOIN MeasureUnit AS MU 
    ON MC_PS.measure_unit_id = MU.id 

INNER JOIN Currency AS CU 
    ON MC_PS.currency_id = CU.id 

INNER JOIN MarketDetails_CommodityDetails AS MD_CD 
     ON MC_PS.market_commodity_details_id = MD_CD.id 

INNER JOIN 
(SELECT id , MAX(price_date) as price_date 
    FROM Market_Commodity_Price_Series 
    GROUP BY id) b on MC_PS.id = b.id AND MC_PS.price_date = b.price_date 
相關問題