请求日期在 SQL 中的多列 min/max
Request multi column min/max with date in SQL
我有一个 SQL table 看起来像 :
日期温度露点湿度
10/12/15 5.1 2.4 57
11/12/15 4.1 5.8 69
12/12/15 20.6 3.6 56
13/12/15 13.0 2.5 21
14/12/15 5.6 13.6 15
15/12/15 5.1 2.4 56
我想知道只用一个 SQL 查询就可以打印出来。那是对于每个数据列,获取最小值和最大值以及发生日期(例如,我想知道最小值 4.1 是在 11/12/15,最大值是 20.6 在 12/12/15。)
是否可以通过一个 sql 查询来完成此操作?具体来说,我希望输出格式为:
日期数据名称数据值
11/12/15 最低温度 4.1
12/12/15 最高温度 20.6
14/12/15 湿度-min 15
11/12/15 湿度-最大 69
您可以通过单个查询轻松完成:
SELECT Date, max(temp), min(temp), max(dewpoint), min(dewpoint), etc...
FROM yourtable
GROUP BY Date
获取 min/maxes 的多列结果。但是在 MySQL 中很难 "unpivot" 将结果转化为单个 column/multi-row 结果。这种转换最好在客户端代码中完成。
在 MySQL 中,最简单的方法可能是使用 substring_index()
/group_concat()
技巧:
select substring_index(group_concat(date order by temp asc), ',', 1) as minTempDate,
substring_index(group_concat(date order by temp desc), ',', 1) as maxTempDate,
substring_index(group_concat(date order by dewpoint asc), ',', 1) as minDPDate,
substring_index(group_concat(date order by dewpoint desc), ',', 1) as maxDPDate,
substring_index(group_concat(date order by humidity asc), ',', 1) as minHumidityDate,
substring_index(group_concat(date order by humidity desc), ',', 1) as maxHumidityDate
from table t;
另一种方法是像这样使用 union all
:
(select date, 'temp-min', temp from table t order by temp asc limit 1)
union all
(select date, 'temp-max', temp from table t order by temp desc limit 1)
union all
(select date, 'humidity-min', humidity from table t order by humidity asc limit 1)
union all
(select date, 'humidity-max', humidity from table t order by humidity desc limit 1)
这正是你想要收到的,但它看起来很糟糕。
SELECT date, 'temp-min' dataName, temp dataValue
FROM numbers WHERE temp = (SELECT min(temp) FROM numbers)
UNION
SELECT date, 'temp-max' dataName, temp dataValue
FROM numbers WHERE temp = (SELECT max(temp) FROM numbers)
UNION
SELECT date, 'humidity-min' dataName, humidity dataValue
FROM numbers WHERE humidity = (SELECT min(humidity) FROM numbers)
UNION
SELECT date, 'humidity-max' dataName, humidity dataValue
FROM numbers WHERE humidity = (SELECT max(humidity) FROM numbers)
;
我有一个 SQL table 看起来像 :
日期温度露点湿度 10/12/15 5.1 2.4 57 11/12/15 4.1 5.8 69 12/12/15 20.6 3.6 56 13/12/15 13.0 2.5 21 14/12/15 5.6 13.6 15 15/12/15 5.1 2.4 56
我想知道只用一个 SQL 查询就可以打印出来。那是对于每个数据列,获取最小值和最大值以及发生日期(例如,我想知道最小值 4.1 是在 11/12/15,最大值是 20.6 在 12/12/15。)
是否可以通过一个 sql 查询来完成此操作?具体来说,我希望输出格式为:
日期数据名称数据值 11/12/15 最低温度 4.1 12/12/15 最高温度 20.6 14/12/15 湿度-min 15 11/12/15 湿度-最大 69
您可以通过单个查询轻松完成:
SELECT Date, max(temp), min(temp), max(dewpoint), min(dewpoint), etc...
FROM yourtable
GROUP BY Date
获取 min/maxes 的多列结果。但是在 MySQL 中很难 "unpivot" 将结果转化为单个 column/multi-row 结果。这种转换最好在客户端代码中完成。
在 MySQL 中,最简单的方法可能是使用 substring_index()
/group_concat()
技巧:
select substring_index(group_concat(date order by temp asc), ',', 1) as minTempDate,
substring_index(group_concat(date order by temp desc), ',', 1) as maxTempDate,
substring_index(group_concat(date order by dewpoint asc), ',', 1) as minDPDate,
substring_index(group_concat(date order by dewpoint desc), ',', 1) as maxDPDate,
substring_index(group_concat(date order by humidity asc), ',', 1) as minHumidityDate,
substring_index(group_concat(date order by humidity desc), ',', 1) as maxHumidityDate
from table t;
另一种方法是像这样使用 union all
:
(select date, 'temp-min', temp from table t order by temp asc limit 1)
union all
(select date, 'temp-max', temp from table t order by temp desc limit 1)
union all
(select date, 'humidity-min', humidity from table t order by humidity asc limit 1)
union all
(select date, 'humidity-max', humidity from table t order by humidity desc limit 1)
这正是你想要收到的,但它看起来很糟糕。
SELECT date, 'temp-min' dataName, temp dataValue
FROM numbers WHERE temp = (SELECT min(temp) FROM numbers)
UNION
SELECT date, 'temp-max' dataName, temp dataValue
FROM numbers WHERE temp = (SELECT max(temp) FROM numbers)
UNION
SELECT date, 'humidity-min' dataName, humidity dataValue
FROM numbers WHERE humidity = (SELECT min(humidity) FROM numbers)
UNION
SELECT date, 'humidity-max' dataName, humidity dataValue
FROM numbers WHERE humidity = (SELECT max(humidity) FROM numbers)
;