Select 将日期匹配到 min() 分组依据
Select matching date to min() group by
我正在尝试 select 最低温度及其相关测量时间(按气象站分组)。它工作正常,除了 measureTime 列与 selected 温度不匹配。谁能帮帮我?
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 |
您应该为最低温度使用子查询,为检索相关的 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
不要使用 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;
您必须在加入表之前使用聚合函数。
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
我正在尝试 select 最低温度及其相关测量时间(按气象站分组)。它工作正常,除了 measureTime 列与 selected 温度不匹配。谁能帮帮我?
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 |
您应该为最低温度使用子查询,为检索相关的 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
不要使用 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;
您必须在加入表之前使用聚合函数。
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