【问题标题】:Request multi column min/max with date in SQL在 SQL 中请求带日期的多列最小值/最大值
【发布时间】:2015-03-15 14:13:09
【问题描述】:

我有一个如下所示的 SQL 表:

日期温度露点湿度
2015 年 10 月 12 日 5.1 2.4 57
2015 年 11 月 12 日 4.1 5.8 69
2015 年 12 月 12 日 20.6 3.6 56
2015 年 13 月 12 日 13.0 2.5 21
15 年 14 月 12 日 5.6 13.6 15
2015 年 15 月 12 日 5.1 2.4 56

我想知道是否可以仅使用一个 SQL 查询将其打印出来。也就是说,对于每个数据列,获取带有发生日期的最小值和最大值(例如,我想知道最小值 4.1 是 11/12/15,最大值是 20.6 是 12/12/15。)

是否可以用一个 sql 查询来做到这一点?具体来说,我希望输出格式为:

日期数据名称数据值
2015 年 11 月 12 日最低温度 4.1
2015 年 12 月 12 日最高温度 20.6
14/12/15 湿度-分钟 15
11/12/15 最大湿度 69

【问题讨论】:

  • 请注意,sql 中的日期遵循特定格式
  • 如果最小值出现在两个或多个日期,应该怎么办?
  • 如果最小值出现在多个日期,最后一个日期就可以了。

标签: mysql sql database minmax


【解决方案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)
;

【讨论】:

  • 您好,感谢您的建议。它似乎有效,但如果我在多个日期具有相同的最大值(或最小值),我会得到所有日期......所以,我需要添加一个额外的过滤器。 Gordon Linoff 给出的解决方案只给出了一个记录 par min/max(并且似乎比你的效率高一点)。如果我想整天都达到最大值,我会保留您的建议。
【解决方案2】:

在 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)

【讨论】:

  • group_concat 带有一个 group_concat_max_len 形式的警告。 upd:但在这种特殊情况下,我想这并不重要
  • 感谢您的建议!第一个解决方案只给我日期,但没有价值......我需要两个!您的第二个建议似乎符合我的要求...在第一种方法中,它似乎比 Marc B 给出的解决方案更有效。
  • @removebeforeflight 。 . .在第一种方法中,您可以添加min(temp)max(temp) 等。但是,您希望结果位于不同的行中,因此第二种方法似乎更可取——除非您有很多很多列。
【解决方案3】:

您可以通过单个查询轻松完成:

SELECT Date, max(temp), min(temp), max(dewpoint), min(dewpoint), etc...
FROM yourtable
GROUP BY Date

获取您的最小值/最大值的多列结果。但是在 MySQL 中,很难将结果“还原”为单列/多行结果。这种转换最好在客户端代码中完成。

【讨论】:

  • 这行不通。这将为您提供每天每列的最小/最大值,而不是与这些最小值/最大值发生日期相关的所有日期。
  • 谢谢。但这不符合我的要求(它给出了每个日期的最小值/最大值)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2020-06-20
  • 1970-01-01
  • 2011-10-31
  • 2013-04-01
  • 2019-12-16
  • 1970-01-01
相关资源
最近更新 更多