获取最接近 sysdate 的日期
Get date nearest to sysdate
我想获得每 N 个 max(date) <= sysdate。如果 past/today 中没有日期存在,我想要最小(日期)。所以我不想要最接近 sysdate 的绝对日期。
测试数据
CREATE TABLE DATTEST (N NUMBER, D DATE);
INSERT INTO DATTEST (N,D) VALUES (1,TRUNC(SYSDATE-2000));
INSERT INTO DATTEST (N,D) VALUES (1,TRUNC(SYSDATE-1000));
INSERT INTO DATTEST (N,D) VALUES (1,TRUNC(SYSDATE+100));
INSERT INTO DATTEST (N,D)VALUES (2,TRUNC(SYSDATE));
INSERT INTO DATTEST (N,D)VALUES (2,TRUNC(SYSDATE+1000));
INSERT INTO DATTEST (N,D)VALUES (3,TRUNC(SYSDATE+1000));
到目前为止我已经知道了。它给出了正确的结果总线进行了两次 table 扫描。我正在处理大型 tables,这个查询被调用了很多次。将其转换为单个 table 扫描时,我一直很头疼。
with nums as
(SELECT LEVEL num
FROM DUAL
CONNECT BY LEVEL <= 3
)
select
num
,(nvl((select max(d)
from dattest
where d <= trunc(sysdate)
and n = num),
(select min(d)
from dattest
where d > trunc(sysdate)
and n = num))
)
from nums;
预期输出
1 26-06-12
2 23-03-15
3 17-12-17
使用带有一些条件逻辑的聚合怎么样?
select id,
coalesce(max(case when d <= trunc(sysdate) then d end),
min(d)
)
from table t
group by id;
我想获得每 N 个 max(date) <= sysdate。如果 past/today 中没有日期存在,我想要最小(日期)。所以我不想要最接近 sysdate 的绝对日期。
测试数据
CREATE TABLE DATTEST (N NUMBER, D DATE);
INSERT INTO DATTEST (N,D) VALUES (1,TRUNC(SYSDATE-2000));
INSERT INTO DATTEST (N,D) VALUES (1,TRUNC(SYSDATE-1000));
INSERT INTO DATTEST (N,D) VALUES (1,TRUNC(SYSDATE+100));
INSERT INTO DATTEST (N,D)VALUES (2,TRUNC(SYSDATE));
INSERT INTO DATTEST (N,D)VALUES (2,TRUNC(SYSDATE+1000));
INSERT INTO DATTEST (N,D)VALUES (3,TRUNC(SYSDATE+1000));
到目前为止我已经知道了。它给出了正确的结果总线进行了两次 table 扫描。我正在处理大型 tables,这个查询被调用了很多次。将其转换为单个 table 扫描时,我一直很头疼。
with nums as
(SELECT LEVEL num
FROM DUAL
CONNECT BY LEVEL <= 3
)
select
num
,(nvl((select max(d)
from dattest
where d <= trunc(sysdate)
and n = num),
(select min(d)
from dattest
where d > trunc(sysdate)
and n = num))
)
from nums;
预期输出
1 26-06-12
2 23-03-15
3 17-12-17
使用带有一些条件逻辑的聚合怎么样?
select id,
coalesce(max(case when d <= trunc(sysdate) then d end),
min(d)
)
from table t
group by id;