【发布时间】:2019-01-11 01:59:33
【问题描述】:
初始数据:
select t.AGENHI, t.TACTHI, t.DTEFHI, t.DTFIHI
from mytable t
where agenhi = '81000040' ;
AGENHI TACTHI DTEFHI DTFIHI
81000040 1 24/02/92 08/03/92
81000040 1 09/03/92 28/02/93
81000040 1 01/03/93 31/05/97
81000040 0,8 01/06/97 31/12/97
81000040 1 01/01/98 31/12/98
81000040 1 01/01/99
使用这个查询:
SELECT AGENHI,
DECODE(TACTHI, 0.05, '005', 0.07, '007', 0.1, '010', 0.137, '013', 0.15,
'015', 0.2, '020', 0.21, '021', 0.23, '023', 0.25, '025', 0.3, '030',
0.34, '034', 0.4, '040', 0.45, '045', 0.5, '050', 0.6, '060', 0.63,
'063',0.7, '070', 0.75, '075', 0.8,'080', 0.84, '084',0.9, '090', 1, '100',
TACTHI) as QUOTITE,
dtefhi as START_DATE,
DECODE(LEAD (DTFIHI, 1) OVER (ORDER BY DTFIHI NULLS LAST) ,null,
to_date('31122099','ddmmyyyy'), LEAD (DTFIHI, 1) OVER (ORDER BY DTFIHI NULLS
LAST)) AS END_DATE
FROM MYTABLE
WHERE AGENHI = '81000040' AND DTFIHI IS NOT NULL;
我明白了:
AGENHI QUOTITE START_DATE END_DATE
81000040 100 08/03/92 28/02/93
81000040 100 28/02/93 31/05/97
81000040 100 31/05/97 31/12/97
81000040 080 31/12/97 31/12/98
81000040 100 31/12/98 31/12/99
但我需要在下一行相同时对“QUOTITE”进行分组,并显示第一行的开始日期和最后一行的日期。
预期结果:
AGENHI QUOTITE START_DATE END_DATE
81000040 100 24/02/92 31/12/97
81000040 080 01/06/97 31/12/98
81000040 100 01/01/98 31/12/99
gordon 提供的解决方案:
选择 agenhi, tacthi, min(dtfihi) 作为 start_date, 领先(max(dtfihi))超过(按agenhi,seqnum-seqnum_2 order by max(dtfihi))作为end_date 从(选择 t.*, row_number() over(按 agenhi order by dtfihi 分区)作为 seqnum, row_number() over (agenhi 分区,dtfihi tacthi order) as seqnum_2 来自 HIA@CHRONOS_TO_S2.WORLD t 其中 agenhi = '81000040' 并且 dtfihi 不为空 ) 吨 按 agenhi 分组,(seqnum - seqnum_2),tacthi;
结果:
81000040 1 08/03/92 null
81000040 1 31/12/98 null
81000040 0,8 31/12/97 null
我怎样才能得到 end_date ? 如果我找到解决方案,我会看看谢谢!
【问题讨论】:
-
这种问题称为间隙和孤岛。对此有很多要求,您可以查找。您必须先获得
quotite,然后从row_number() over (order by dtfihi)中减去row_number() over (partition by quotite order by dtfihi)以获得组密钥。然后聚合获得每个组键的最小和最大日期。最后使用LEAD调整结束日期。