mysql 从表中选择较近的日期[分组依据和排序依据]

jvidinwx  于 2023-02-07  发布在  Mysql
关注(0)|答案(1)|浏览(156)

我正在尝试为每个组类型、子类型、s_stype、category_id查找最近的日期。如果没有找到日期,请使用默认值:
样本数据:
| 类型|亚型|类型|类别ID|日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1个|1个|二一一|两千万|
| 1个|1个|1个|二一一|三千万|
| 1个|1个|第二章|二一一|两千万|
| 1个|1个|第二章|二一一|两千万|
| 1个|1个|三个|二一一|零|
| 1个|1个|第二章|三一一|五亿|
| 1个|1个|第二章|三一一|四千万|
| 1个|1个|第二章|三一一|零|
质询:

Select * 
from Table  
where date <= input_date or date is null 
group by Type, Subtype, s_stype, category_id 
order by date desc

查询应针对每个类型、子类型、s_stype、类别采用较少的最近日期。

    • 例如,给定input_date = 25000000**:

| 类型|亚型|类型|类别ID|日期|
| - ------|- ------|- ------|- ------|- ------|
| 1个|1个|1个|二一一|两千万|
| 1个|1个|第二章|二一一|两千万|
| 1个|1个|三个|二一一|零|
| 1个|1个|第二章|三一一|零|
查询应该给出上述结果,而不是给出错误行,即第一行满足给定组标准的where条件
由于我使用了mysql5.7,所以我需要解决方案,没有窗口函数的解决方案,如上述

zfycwa2u

zfycwa2u1#

获得每组中最好的行意味着不存在该组中更好的行。而“更接近”意味着两个日期之差的绝对值更小。这就是我下面的查询的工作原理。
由于示例中的日期是整数,所以我在这里展示整数数学。如果您使用的是真实的日期,则必须使用DATEDIFF而不是减法,因为MySQL有一个缺陷,允许从一个日期减去另一个日期,但返回一些似乎没有意义的数字,而不是返回一个间隔或预定义单位(如日期)的值。

select * 
from mytable
where not exists
(
  select null 
  from mytable better
  where better.type = mytable.type
    and better.subtype = mytable.subtype
    and better.s_stype = mytable.s_stype
    and better.category_id = mytable.category_id
    and 
    (
      abs(better.date - 25000000) < abs(mytable.date - 25000000)
      or
      (better.date is not null and mytable.date is null)
    )
)
order by type, subtype, s_stype, category_id, date;

相关问题