【问题标题】:MySQL - max( ) row values of subqueryMySQL - 子查询的 max() 行值
【发布时间】:2014-01-10 23:58:48
【问题描述】:

我有一张表格,其中每 15 分钟记录一次降雨量,因此一天的总降雨量是 95 条记录中“雨”的总和。以下查询正确返回了日期列表和当天的降雨量。

select thedate as tdate,sum(rain) as dailyrain
from  weatherdata
group by year(thedate), month(thedate), day(thedate)

(日期存储为日期时间,雨存储为整数)

我现在想将此作为子查询并返回最大降雨量的日期。

我下面的查询正确地返回了最大降雨量,但不是与该降雨量相关的正确日期。

select maxdate,max(dailyrain) from (select thedate as maxdate,sum(rain) as dailyrain
from  weatherdata
group by year(thedate), month(thedate), day(thedate)) as maxrain

我想我可能必须使用 JOIN。我知道这里已经回答了许多类似的问题,但我无法完全正确地使用语法来完成这项工作。任何帮助将不胜感激。

【问题讨论】:

  • 您也可以将群组更改为GROUP BY DATE(thedate)。效率会稍微高一些。
  • 这里不需要子选择,只是适当的分组。

标签: mysql subquery max


【解决方案1】:
SELECT DATE(thedate) as tdate, sum(rain) as dailyrain
FROM weatherdata
GROUP BY DATE(thedate)
ORDER BY sum(rain) DESC, DATE(thedate) DESC
LIMIT 1 ;

或:

SELECT DATE(thedate) as tdate, sum(rain) as dailyrain
FROM weatherdata
GROUP BY DATE(thedate)
ORDER BY dailyrain DESC, tdate DESC
LIMIT 1 ;

【讨论】:

  • @eggyal 感谢您的建设性提示。我想我现在已经修好了。
  • 是的。现在打成平手,结果是确定的,但仍然只是一个(最近的)记录——这可能不是 OP 想要的。
  • 谢谢,但这会产生语法错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“1 thedate as tdate, sum(rain) as dailyrain”附近使用正确的语法
  • 啊——第一个版本出现语法错误,但编辑后的版本似乎给出了正确的答案——谢谢!优雅简约!目前它只能处理大约 12 天的数据。
  • 是的 - 这绝对有效。我想如果它在平局的情况下返回所有结果会很整洁,但是平局不太可能,因为我正在记录几分之一毫米(我对 INT 撒谎!),我对此非常满意。谢谢!
【解决方案2】:

要获得所有个降雨量最大的日期:

SELECT   DATE(thedate), SUM(rain)
FROM     weatherdata
GROUP BY DATE(thedate)
HAVING   SUM(rain) = (
           SELECT   SUM(rain)
           FROM     weatherdata
           GROUP BY DATE(thedate)
           ORDER BY SUM(rain) DESC
           LIMIT    1
         )

【讨论】:

  • 嗨 - 谢谢。这将按日期顺序返回所有天数和每日降雨量,而不选择最大值。
  • 我看到它在 sql Fiddle 中确实有效 - 可能是我的测试服务器使用的是旧版本的 mySQL - 我明天会检查它。非常感谢您的帮助。
【解决方案3】:

请试试这个

select tdate,dailyrain from
   (select date(thedate) as tdate,sum(rain) as dailyrain
    from  weatherdata
    group by date(thedate))r
WHERE dailyrain =
                  (select max(dailyrain) as maxrain from
                      (select date(thedate) as tdate,sum(rain) as dailyrain
                       from  weatherdata
                       group by date(thedate)
                      )m
                   )

sqlFiddle

【讨论】:

  • 嗨 - 谢谢。这给出了'字段列表'中的'未知列'雨''
  • 你有一个名为rain的专栏吗?我以为你做到了,试试 sqlFiddle。
  • 嗨 - 是的 - 我确实有一个名为雨的专栏。这在 sqlFiddle 中可以正常工作,但在我的项目中却不行(使用 Coldfusion)。也许这使用了不同的规则?
  • 奇怪,我认为它独立于编程语言,因为它是由 mySQL 服务器运行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2019-10-23
  • 2020-03-20
  • 2014-12-31
相关资源
最近更新 更多