【问题标题】:How to get the latest data point in each month in each year?如何获取每年每个月的最新数据点?
【发布时间】:2021-07-02 07:39:57
【问题描述】:

这是我的数据集的示例 sn-p。 多年来,我每年的每个月都有多个数据点。 我想获取每年每个月的最新行

例如:

     data       value
   2019-01-1     10
   2019-01-7     20
   2019-01-28    30
                 
   2019-03-4     50
   2019-03-17    40 
   2019-03-28    20

   2020-04-16    80 
   2020-04-18    60
   2020-04-30    40

   2020-05-16    90 
   2020-05-18    10
   2020-05-30    80

预期输出

data         value
2019-01-28    30
2019-03-28    20
2020-04-30    40
2020-05-30    80

我想用flask-sqlalchemy 来实现这一点。 我在想我可能必须按月分组?我对 sql 查询很陌生。任何帮助将不胜感激!

编辑:我试过这个:

GROUP BY EXTRACT(year FROM date),
EXTRACT(month FROM date) 

但这给了我每个月的第一行,我想要最后一行,即最新行

【问题讨论】:

  • 也许我得按月分组?按年和月。
  • 谢谢!我试过这个GROUP BY EXTRACT(year FROM date), EXTRACT(month FROM date) HAVING MAX(date) ORDER BY EXTRACT(YEAR FROM date) 但我无法获得本月的最后一行(这是必需的行)。我得到了本月的第一行。

标签: mysql sql flask-sqlalchemy


【解决方案1】:

MySQL 的解决方案。

SELECT t1.*
FROM table AS t1
JOIN ( SELECT MAX(data) AS data
       FROM table t2
       GROUP BY DATE_FORMAT(data, '%Y%m') ) t3 USING (data)

查询假定data 列没有重复项(定义为UNIQUE)。


GROUP BY 表达式可能是 GROUP BY EXTRACT(year FROM data), EXTRACT(month FROM data),正如您所尝试的那样......甚至是 GROUP BY data DIV 100。没关系。

【讨论】:

    【解决方案2】:

    一种方法使用窗口函数:

    select t.*
    from (select t.*,
                 row_number() over (partition by year(data), month(data) order by data desc) as seqnum
          from t
         ) t
    where seqnum = 1;
    

    您还可以使用相关子查询:

    select t.*
    from t
    where t.data = (select max(t2.data)
                    from t t2
                    where year(t2.data) = year(t.data) and
                          month(t2.data) = month(t.data)
                   );
    

    通常,相关子查询的性能更好。但是,在这种情况下,它不能(容易)使用索引进行优化,所以我怀疑窗口函数更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多