【问题标题】:Select max 1 record per year from a MySQL table从 MySQL 表中每年最多选择 1 条记录
【发布时间】:2022-01-24 11:42:51
【问题描述】:

我需要从 MySQL 表中提取数据,但如果之前的记录不到一年,则不允许包含记录。

鉴于以下记录,仅应包括记录 135(因为记录 2 是在记录后 1 个月创建的1,并且记录 4 是在记录 3 后 1 个月创建的):

1   2019-12-21
2   2020-01-21
3   2021-12-21
4   2022-01-21
5   2023-12-21

我想出了以下非功能性解决方案:

SELECT 
    * 
FROM 
    table t 
WHERE 
    (created_at > DATE_ADD(
        (SELECT 
            created_at 
        FROM 
            table t2 
        WHERE 
            t2.created_at < t.created_at 
        ORDER BY 
            t2.created_at 
        DESC LIMIT 1), INTERVAL 1 YEAR)

但这只会返回第一条和最后一条记录,而不是第三条:

1   2019-12-21
5   2023-12-21

我知道原因:第三条记录被排除在外,因为记录 2 不到一年。但是不应该考虑记录 2,因为它不会自己列出。

我该如何解决这个问题?

【问题讨论】:

  • 每年的最大记录 记录如果比上一年多。记录
  • created_at - LAG(created_at) 在 CTE 中。
  • 除此之外,关系数据库有,而不是记录。

标签: mysql sql


【解决方案1】:

使用lag,假设你的MySql支持,你可以使用period_diff计算月差

with d as (
  select * , 
    period_diff(extract(year_month FROM date),
      extract(year_month from lag(date,1,date) over (order by date))
    ) as m
  from t
 )
 select id, date
 from d
 where m=0 or m>12

Demo Fiddle

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 2012-11-04
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多