【问题标题】:How to select a row for every location for every day using SQL?如何使用 SQL 为每天的每个位置选择一行?
【发布时间】:2022-01-18 11:43:57
【问题描述】:

我有一个数据库,其中存储了两个位置的一些预测。每个位置都有 3 天的预报,每天每小时都有多个预报。 我想选择每个位置每天 3 个最新预报的平均温度。位置保存为“位置”,每天保存为“applicable_date”,每天都有一个预测,每小时保存为“已创建”。我正在尝试这样的事情但不起作用:

SELECT * FROM (
    SELECT * FROM `forecast` GROUP BY location
) GROUP BY applicable_date 
ORDER BY created DESC 
LIMIT 3

【问题讨论】:

  • 请提供您的表格结构、测试数据和想要的结果minimal reproducible example
  • 按位置分组并预测截断到日期的日期时间。获取每组的最大预测日期时间。
  • @Nathan_Sav 您的查询将为每个位置提供一个最大日期时间,而不是“每天”。
  • 您应该接受最佳答案,然后提出新问题。考虑到基于原始问题已经提供的答案/工作,更改问题以添加更多请求并不是一个好主意。您还忽略了提供有关您正在使用的 MySQL 版本的详细信息:SELECT version(); 这可能会简化解决方案,例如,如果您使用的是 MySQL 8.0 或更高版本或 MariaDB 10.2.2 或更高版本。很难知道您是需要超过 3 天的 AVG 还是每天的最后 3 个样本。

标签: mysql sql select group-by sql-order-by


【解决方案1】:

这样的事情应该没问题。这些返回每一天/位置的整个预测行。

对于 8.0+ 版本:

WITH cte AS (
       SELECT *
            , ROW_NUMBER() OVER (PARTITION BY location, applicable_date ORDER BY created DESC ) AS rn
         FROM forecast
     )
SELECT *
  FROM cte
 WHERE rn = 1
;

对于 8.0+ 及之前的版本:

SELECT f.*
  FROM (
       SELECT location, applicable_date
            , MAX(created) AS max_created
         FROM forecast
        GROUP BY location, applicable_date
     ) AS cte
  JOIN forecast AS f
    ON f.location        = cte.location
   AND f.applicable_date = cte.applicable_date
   AND f.created         = cte.max_created
;

【讨论】:

  • 非常感谢!!我还想为每个位置每天选择最后 3 个预测中的“the_temp”
【解决方案2】:
SELECT location, 
       CAST(created AS DATE) `date`, 
-- or  applicable_date `date`,
       MAX(created) last_datetime
FROM forecast
GROUP BY 1, 2;

【讨论】:

  • 谢谢你的工作!但我想返回所有行不仅是位置和日期
  • @user15924442 参见the answer 提供的@JonArmstrong
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 2019-01-20
  • 2013-05-05
相关资源
最近更新 更多