在这种特定情况下,如何使用 SQL 仅检索与日期字段的最后一个值相关的记录?

How can I retrieve only the record related to the last value of a date field in this specific case using SQL?

我不太喜欢数据库,我发现在尝试修改 MySql 上定义的查询时遇到了一些问题。

我有这个查询是我的起始查询(必须修改的查询):

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

本次查询returns某市场某商品的价格,这是查询输出:

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

我如何才能正确实施此更改?

也许我可以使用 GROUP BY 以某种方式与 HAVING 子句一起使用?

您的 Market_Commodity_Price_Series table 是否有自动递增的 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

此查询查看您的 table 并查找每件商品的最新日期。然后它恢复该项目的 id 值。然后,您可以在 WHERE id IN () 子句中使用整个子查询,如上所示。

哦。琼斯的第一个想法不是一个好主意。使用子查询获取最新日期的记录并加入该记录。这是未经测试的,但请查看最后一个 join

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