我遇到了一个问题,即组合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
客户列表,然后是过去和未来的数据(如果存在)...有任何帮助吗?
答案 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