【问题标题】:Get last row for given dates if date doesn't exist如果日期不存在,则获取给定日期的最后一行
【发布时间】:2019-01-02 09:39:33
【问题描述】:

我们如何查询一组记录以获取可能存在日期间隙的特定日期的数据。

示例数据

date       | Price
------------------
2018-03-31 | 115
2018-03-29 | 114
2018-03-28 | 113
...
2017-03-29 | 117
2017-03-28 | 118
...
2016-12-30 | 143
2016-12-29 | 140
...
2015-12-31 | 110
2015-12-30 | 111

日期所需的数据:2018-03-31、2017-03-31、2016-12-31、2015-12-31

date       | Price
------------------
2018-03-31 | 115
2017-03-31 | 117
2016-12-31 | 143
2015-12-31 | 110

【问题讨论】:

  • 这看起来像是获取最新价格的 GROUP BY 语句和用于选择特定日期的 IN 运算符的组合
  • Required Data for dates的形式是什么?一个输入表(日期数组),一个字符串分隔的日期值?
  • @PhamX.Bach 输入是日期数组。
  • 你想要的输出背后的逻辑是什么?要在特定年份的特定月份结束时获得最高价格,还是我错过了?
  • @codtex 似乎在不存在确切日期的情况下回退到最近的先前日期。

标签: mysql sql date


【解决方案1】:

您可以通过相关子查询来做到这一点。以下将返回确切日期或最接近的先前日期的价格:

SELECT dates.dt, (
    SELECT price
    FROM t
    WHERE date <= dates.dt
    ORDER BY date DESC
    LIMIT 1
) AS price
FROM (
    SELECT '2018-03-31' AS dt UNION ALL
    SELECT '2017-03-31' UNION ALL
    SELECT '2016-12-31' UNION ALL
    SELECT '2015-12-31'
) AS dates

Demo on db<>fiddle

【讨论】:

  • IN 运算符相比,这将相当慢。
  • @iamrajshah 你将如何使用 IN 操作符来做到这一点?
  • @SalmanA 这是非常非常聪明和高效的。我学会了一种新的在 SQL 中循环的技巧。谢谢你。
【解决方案2】:

您可以使用 MySQL Last day 函数和 date_format 来实现所需的结果。查看查询:-

select last_day(a11.d_date), a11.price
from test a11
join
(select MAX(d_date) d_date, DATE_FORMAT(d_date, "%M %Y")
from test
group by DATE_FORMAT(d_date, "%M %Y")
) a12
on a11.d_date = a12.d_date

SQL Fiddle

【讨论】:

    【解决方案3】:

    看来你需要一年的最高价格

    select max(date), max(price)
    from my_table  m 
    inner join  (
    
      select max(date), year(date) my_year
      from my_table 
      group by year(date) 
    
    ) t on t.my_year = year(m.date) 
    group by year(m.date)
    

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 2022-01-26
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多