SQL查询以获取最近的上一个和下一个日期?

时间:2016-11-09 14:17:15

标签: mysql

我遇到了一个问题,即组合SQL查询应该显示CURDATE()的最近(上一个和下一个)日期。

我有客户和桌上女巫活动的桌子

与客户一起表:

konto_odbiorcy | name
---------------+----------------
2              | Sony LTD
3              | Panasonic LTD
etc...

这就是我在事件中的表格:

number | date 
-------+-------------
2      | 2016-11-01
2      | 2016-11-06
2      | 2016-11-14
3      | 2016-11-02
3      | 2016-11-21
3      | 2016-11-26

我需要知道最后的过去日期和下一个最近的未来日期是什么,如:

number | date past   | date future
-------+-------------+-------------
2      | 2016-11-06  | 2016-11-14
3      | 2016-11-02  | 2016-11-21

如您所见,number=3告诉我2016-11-21而非2016-11-26

当我想要显示过去最近的日期时:

SELECT number, date AS past
FROM 3ce_event
WHERE date <= CURDATE()

进行下一次活动:

SELECT number, date AS future
FROM 3ce_event
WHERE date >= CURDATE()

现在如何在一个SQL查询中将这两个与我的customers表进行比较?

修改

我将查询更改为 Mike 回答:

select 
    number, klienci_ax_all.nazwa, miasto,
    max(case when date<=curdate() then date end) as date_past,
    min(case when date>=curdate() then date end) as date_future
from 3ce_event
inner join klienci_ax_all on 3ce_event.number = klienci_ax_all.konto_odbiorcy
group by konto_odbiorcy

看起来非常好,但我的客户表(klienci_ax_all)有问题。如果对于一个或多个客户,3ce_event表中没有任何内容,则表示我没有此客户为Null date_past和Null date_future。

我需要完整的klienci_ax_all客户列表,然后是过去和未来的数据(如果存在)...有任何帮助吗?

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是自行加入事件,为每个组的每个日期的最小值/最大值生成子集。

SELECT E.Number, E2.LTDate as `Date Past`, E1.GTDate as `Date Future`
FROM Events E
LEFT JOIN (SELECT number, min(date) GTDate 
           FROM events
           WHERE date >= CurDate 
           GROUP BY Number) E1
 on E.Number = E1.Number
LEFT JOIN (SELECT number, Max(date) LTDate 
           FROM events
           WHERE date <= CurDate 
           GROUP BY Number) E2
 on E.Number = E2.Number

另一种方法是使用相关内联查询(在选择中选择w)来查找最小值/最大值

SELECT E.Number
    , (Select max(E1.date) from events E1 where E1.Number = E.Number and E1.date<=sysdate)
    , (Select min(E1.date) from events E2 where E2.Number = E.Number and E2.date>=sysdate)
FROM Events E

我是第一种方法的粉丝,因为它不必为事件表中的每条记录执行3次查询;但是在较小的数据集上,第二个可能会更快。

答案 1 :(得分:1)

select number,
       max(case when date<=curdate() then date end) as date_past,
       min(case when date>=curdate() then date end) as date_future
  from event
 group by number