代码之家  ›  专栏  ›  技术社区  ›  AndreaNobili

如何修改此查询以添加一个新字段,该字段包含总原始记录子集的字段的最大值?

  •  0
  • AndreaNobili  · 技术社区  · 7 年前

    我有这样一个MeteoForecast表:

    CREATE TABLE MeteoForecast (
      id                   BigInt(20) NOT NULL AUTO_INCREMENT,
      localization_id      BigInt(20) NOT NULL,
      seasonal_forecast_id BigInt(20),
      meteo_warning_id     BigInt(20),
      start_date           DateTime NOT NULL,
      end_date             DateTime NOT NULL,
      min_temp             Float,
      max_temp             Float,
      icon_link            VarChar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, 
      PRIMARY KEY (
          id
      )
    ) ENGINE=InnoDB AUTO_INCREMENT=3 ROW_FORMAT=DYNAMIC DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
    

    它包含气象预报信息,如下所示:

    id                   localization_id      start_date              end_date                min_temp             max_temp             icon_link                                                                                                                                                                                                                                                      
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1                    1                    18/09/2017 06:00:00     18/09/2017 12:00:00     15                   24                   Mostly_Cloudy_Icon.png                                                                                                                                                                                                                                         
    2                    1                    18/09/2017 12:00:00     18/09/2017 18:00:00     15                   24                   Light_Rain.png                                                                                                                                                                                                                                                 
    3                    1                    19/09/2017 06:00:00     19/09/2017 12:00:00     12                   22                   Mostly_Cloudy_Icon.png                                                                                                                                                                                                                                         
    4                    1                    19/09/2017 12:00:00     19/09/2017 18:00:00     13                   16                   Mostly_Cloudy_Icon.png                                                                                                                                                                                                                                         
    5                    1                    20/09/2017 06:00:00     20/09/2017 12:00:00     18                   26                   Light_Rain.png                                                                                                                                                                                                                                                 
    6                    1                    20/09/2017 12:00:00     20/09/2017 18:00:00     17                   25                   Light_Rain.png                  
    

    因此,我创建了一个简单的查询,用于提取特定范围内的所有记录(在本例中为2天):

    select * from MeteoForecast 
    where start_date between  '2017-09-18 06:00:00' and '2017-09-20 06:00:00'
    order by start_date desc;
    

    我必须按以下方式修改此查询:

    对于上一个查询检索到的每个记录,必须添加一个名为 全局最大温度 这是 最高温度

    做一个与日期相关的记录相关的示例 开始日期 ,以下是我需要获得的记录:

    id                   localization_id      start_date              end_date                min_temp             max_temp             icon_link                       global_max_temp                                                                                                                                                                                                                                                      
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------    
    3                    1                    19/09/2017 06:00:00     19/09/2017 12:00:00     12                   22                   Mostly_Cloudy_Icon.png          22                                                                                                                                                                                                                                     
    4                    1                    19/09/2017 12:00:00     19/09/2017 18:00:00     13                   16                   Mostly_Cloudy_Icon.png          22
    

    如您所见,最后一个字段(在此模拟中手动插入)是 在与这一天相关的两个记录中都包含了价值 因为它是 最高温度 与特定日期相关的所有记录的字段。

    这是计算这些的查询 全局最大温度 价值:

    select max(max_temp) from MeteoForecast 
    where start_date = '2017-09-19 06:00:00'
    

    如何将此功能添加到原始查询?

    1 回复  |  直到 7 年前
        1
  •  1
  •   etsa    7 年前

    你能试试这样的东西吗

    SELECT A.*, B.GLOBAL_MAX_TEMP
    FROM (
        select id, start_date, end_date, min_temp, max_temp
        from MeteoForecast 
        where start_date between  '2017-09-18 06:00:00' and '2017-09-20 06:00:00'
        ) A
    INNER JOIN (SELECT  date(start_date) AS date_only, MAX(max_temp) AS GLOBAL_MAX_TEMP
                FROM MeteoForecast
                WHERE start_date BETWEEN  '2017-09-18 06:00:00' and '2017-09-20 06:00:00'
                GROUP BY date(start_date)
                ) B ON date(A.start_date) = B.date_only
    ORDER by start_date desc;