【问题标题】:MySQL: get next closest value out of in-listMySQL:从列表中获取下一个最接近的值
【发布时间】:2016-12-21 07:14:14
【问题描述】:

对于下表:

attr1       date
================
a     2016-12-21
a     2016-11-15
a     2015-04-15
b     2016-10-15
b     2013-10-15
b     2011-10-15
c     2015-01-01
d     2014-02-02

我想获取 attr1 = a 和 date = max(inputDate x) 与 x

对于 attr1 = b 和输入日期 y 以及其他几个属性和日期也是如此。

对于单个日期值,解决方案类似于:

SELECT MAX(no) no
FROM table1
WHERE no < 10

(见: MySql select next lower number without using limit)

问题:

如何通过一次选择来解决这个问题,以便日期 (x, y, ...) 和请求的 attr1 值都在 :list 的条目中 - 它应该类似于:

select * from table where attr1 in (..., ..., ...) .... and date in (x, y, ...

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    解决方案是在子查询中包含参数列表:

    select mytable.attr1, max(mytable.dt)
    from
    (
      select 'a' as attr1, '2015-11-20' as dt
      union all
      select 'b' as attr1, '2015-11-19' as dt
      union all
      select 'c' as attr1, '2015-11-18' as dt
      union all
      select 'd' as attr1, '2013-01-01' as dt
    ) params
    join mytable on mytable.attr1 = params.attr1 and mytable.dt >= params.dt
    group by mytable.attr1;
    

    【讨论】:

    • 顺便说一句,这并没有为您提供最接近的日期。我想你要么想要mytable.dt &lt;= params.dt 要么想要min(mytable.dt)
    • 因为我必须提供多达 180 个日期,所以只有“列表中的日期”方法才能正常工作.. :-(
    • “将正常工作”是什么意思?上面的查询应该可以工作,不管你有两个日期还是两千个日期。如果您愿意,也可以使用临时表并用日期填充它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2012-10-13
    • 2016-07-07
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多