我的查询结果/表包含列:id,date。喜欢:
id,日期
0001,2012.01.20
0001,2014.10.12
0001,null
0001,2017.05.21
0001,2017.08.15
0002,null
0002,2013.06.05
0002,2017.08.11
0003,null
0004,2011.12.25
0005,2017.12.10
0006,null
0006,2013.04.23
。
。
。
等等...
这是一个例子 - 在现实世界中,有成千上万的id和超过一百五十万的记录。如何找到最接近今天的未来日期(id' s1000,0002,0005)的记录,这些记录仅使用null(id 0003),过去的日期(id 0004)或null和过去的日期(id 0006)替换为某些文本。结果应如下所示:
id,日期
0001,2017.05.21
0002,2017.08.11
0003,'替换文字'
0004,'替换文字'
0005,2017.12.10
0006,'替换文字'
。
。
等等...
我希望这个例子能说明我需要的东西
谢谢你的任何线索。
答案 0 :(得分:1)
表似乎没有主键。 不要使用字段名称作为类型名称,例如“DATE”。
无论如何,这里有一个如何做你想要的例子,没有声称它是最好的。
请注意,如果记录很多,此过程将会很慢,因此请确保放置正确的索引。
SET TERM ^ ;
create or alter procedure TEMP_TEST_PROC (
IDATE date)
returns (
OID varchar(4),
DATE_BEFORE date,
DATE_AFTER date,
CLOSEST_DATE date,
OTEXT varchar(32))
as
begin
for select distinct id from test_table_wo_pk
into :oid
do
begin
date_before = null;
date_after = null;
/* get closest past date*/
select first 1 t."DATE" from test_table_wo_pk t
where ((t."DATE" <= :idate) and (t.id = :oid))
order by t."DATE" desc
into
:date_before;
/* get closest future date*/
select first 1 t."DATE" from test_table_wo_pk t
where (t."DATE" >= :idate) and (t.id = :oid)
order by t."DATE"
into
:date_after;
/* bonus - get closest future or past date */
... You may check date_before, date_after for NULL here, and set closest_date value here....
if ((datediff(day,:date_before,:idate)) < (datediff(day,:idate,date_after))) then
closest_date = :date_before;
else
closest_date = :date_after;
/* set text column */
if (:date_after is not null) then
otext = :date_after;
else
otext = 'replased text';
suspend;
end
end^
SET TERM ; ^
结果: