在这种特定情况下,如何使用 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_id 和 commodity_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
我不太喜欢数据库,我发现在尝试修改 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_id 和 commodity_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