选择匹配日期到 min() 分组依据

Posted

技术标签:

【中文标题】选择匹配日期到 min() 分组依据【英文标题】:Select matching date to min() group by 【发布时间】:2019-12-05 10:46:33 【问题描述】:

我正在尝试选择最低温度,它是按气象站分组的相关测量时间。它工作正常,除了 measureTime 列与所选温度不匹配。谁能帮帮我?

    SELECT
        weatherstations.weatherstation_name AS name,
        min(weatherstations_data.weather_airtemp) AS airTemp,
        weatherstations_data.weather_measuretime AS measureTime
    FROM
        weatherstations 
    LEFT JOIN
        weatherstations_data 
    ON 
        weatherstations.weatherstation_id = weatherstations_data.weatherstation_id
    WHERE
        weatherstations_data.weather_airtemp IS NOT NULL 
    GROUP BY
        weatherstations.weatherstation_name
    ORDER BY 
        airTemp ASC 
    LIMIT 
        10

当前结果如下所示:

name            airTemp   measureTime
---------------|---------|---------------------|
Latnivaara A   | 7.5     | 2019-07-27 00:00:00 |
Nikkaluokta A  | 8.6     | 2019-07-27 00:00:00 |
Graninge       | 8.9     | 2019-07-27 00:20:02 |
Rensjön A      | 8.9     | 2019-07-27 00:00:00 |
Pajala A       | 9.4     | 2019-07-27 00:00:00 |
Åkroken        | 9.4     | 2019-07-27 00:20:02 |
Norrhög        | 9.6     | 2019-07-27 00:20:02 |
Karesuando     | 9.8     | 2019-07-27 00:20:02 |
Noppikoski     | 9.8     | 2019-07-27 00:20:01 |
Nikkaluokta    | 9.8     | 2019-07-27 00:20:00 |

期望的结果是:

name            airTemp   measureTime
---------------|---------|---------------------|
Latnivaara A   | 7.5     | 2019-07-27 03:00:00 |
Nikkaluokta A  | 8.6     | 2019-07-27 03:00:00 |
Graninge       | 8.9     | 2019-07-27 04:20:01 |
Rensjön A      | 8.9     | 2019-07-27 04:00:00 |
Pajala A       | 9.4     | 2019-07-27 03:00:00 |
Åkroken        | 9.4     | 2019-07-27 05:20:02 |
Norrhög        | 9.6     | 2019-07-27 00:20:02 |
Karesuando     | 9.8     | 2019-07-27 03:00:00 |
Noppikoski     | 9.8     | 2019-07-27 01:20:00 |
Nikkaluokta    | 9.8     | 2019-07-27 02:00:00 |

【问题讨论】:

没有数据集的结果集就像没有棒棒糖的棍子。没什么好玩的。 Get records with max value for each group of grouped SQL results的可能重复 这是 SQL 中的一个常见问题,称为“groupwise-maximum”。在手册中找到问题的描述和几种解决方法:dev.mysql.com/doc/refman/8.0/en/… 【参考方案1】:

您应该对 min temp 使用子查询,并使用 join 来检索相关的 measureTime

select  t.name, t.airTemp, d.measureTime 
from  (
    SELECT
        s.weatherstation_id 
        s.weatherstation_name AS name,
        min(d.weather_airtemp) AS airTemp
    FROM  weatherstations s
    LEFT JOIN weatherstations_data  d  ON  s.weatherstation_id = d.weatherstation_id
    WHERE d.weather_airtemp IS NOT NULL 
    GROUP BY s.weatherstation_name
    ORDER BY airTemp ASC 
    LIMIT  10
) t  
inner join  weatherstations_data d ON t.weatherstation_id = d.weatherstation_id
    AND  t.airTemp  = d.weather_airtemp 

【讨论】:

【参考方案2】:

不要使用GROUP BY 进行过滤查询。一个简单的解决方案是用于过滤的相关子查询:

SELECT ws.weatherstation_name AS name,
       ws.weather_airtemp AS airTemp,
       wsd.weather_measuretime AS measureTime
FROM weatherstations ws LEFT JOIN
     weatherstations_data wsd
     ON ws.weatherstation_id = wsd.weatherstation_id
WHERE wsd.weather_airtemp IS NOT NULL AND
      wsd.weather_airtemp = (SELECT MIN(wsd2.weather_airtemp)
                             FROM weatherstations_data wsd2
                             WHERE wsd2.weatherstation_id = wsd.weatherstation_id
                            )
ORDER BY airTemp ASC 
LIMIT 10;

【讨论】:

【参考方案3】:

在加入表格之前,您必须使用聚合函数。

    SELECT
    t1.weatherstation_name AS name,
    t2.weather_airtemp AS airTemp,
    t2.weather_measuretime AS measureTime
FROM
    weatherstations t1
LEFT JOIN(
   SELECT weatherstation_id , weather_measuretime , min(weather_airtemp) as weather_airtemp 
   FROM weatherstations_data 
   group by weather_airtemp
   ) t2 
ON 
    t1.weatherstation_id = t2.weatherstation_id
WHERE
    t2.weather_airtemp IS NOT NULL 
GROUP BY
    t1.weatherstation_name

LIMIT 
    10

【讨论】:

以上是关于选择匹配日期到 min() 分组依据的主要内容,如果未能解决你的问题,请参考以下文章

excel中如何依据日期相等实现数据匹配

分组依据并在日期下显示条目

MySQL选择分钟匹配的日期时间

分组依据、IFNULL 和按日期排序

模型和日期选择器之间的角度 UI 引导日期不匹配

按日期获取匹配结果