一个奇怪的case when

        昨天写一个查询,要求取到一些时间字段到现在的时间段,于是想到在where 后面写case when语句把时间分段,但是在实际实验中发现,当参数满足了第二条when表达式之后,还会继续满足后面的when表达式,甚至于满足所有的when表达式。于是把问题抽象一下,写成了下面的SQL语句,发现结果变得非常有趣:
/*Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit
**Edit date: 2011-08-16
*/
with a as
 (select '2010.01' as c1, 'a' as c2, 4 as c3 from dual
 union all
  select '1999.10' as c1, 'b' as c2, 5 as c3 from dual
 union all
  select '1970.01' as c1, 'c' as c2, 6 as c3 from dual)

select case
    when MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 20 then '10'
    when MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) >= 20 and MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 400 then '20'
    when MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) >= 400 and MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 600 then '30'
    else '0'
    end flag,
    a.* from a
  where 'AL' = 'ALL'  or  '20' = case
    when MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 20  then '10'
    when MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) >= 20 and MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 400 then '20'
    when MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) >= 400 and MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 600 then '30'
    else '0'
   end

运行结果如下:

flag    c1          c2     c3
20	1999.10	     b	    5
30	1970.01	     c	    6

可以看到,当第二个when表达式的返回结果‘20’正好满足条件,但是运行之后却把第二和第三个when的结果全查询出来了。

经过反复修改,发现把前面并未执行的 ‘AL’ = 'ALL' or 注释之后,结果正确;或者把第一个when 的表达式改为 

 MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) < 20  and MONTHS_BETWEEN(SYSDATE,TO_DATE(a.c1, 'YYYY.MM')) > 0 
结果也会正确;把后面的else语句去掉或者改为 else null 返回空值结果也会正确。但是偏偏这个看上去并没有什么语法或者逻辑错误的SQL语句会执行不正确。

       经过和同事的研究,还是不知所以然,因为这个问题好像在9i和11g的版本上执行时并不会出现,也许,这是一个蛋疼的BUG吧……


personId ='1084716653536636045'这条据,库里本来为Bigint类型的,但是执行下面sql为什么出现两种情况 UPDATE t_epm_checkrules SET FrdFirstContractPerson = CASE personId WHEN '1084716653528248064' THEN 'N' WHEN '1084716653536636045' THEN 'N' WHEN '1084716653536636238' THEN 'N' ELSE frdFirstContractPerson END, FMODIFYTIME = CASE personId WHEN '1084716653528248064' THEN now() WHEN '1084716653536636045' THEN now() WHEN '1084716653536636238' THEN now() ELSE FMODIFYTIME END WHERE personId IN ('1084716653528248064', '1084716653536636045', '1084716653536636238') 将据更新成了N, 这个语句将据更新成了Y; UPDATE t_epm_checkrules SET FrdFirstContractPerson = CASE personId WHEN '1084716653528248064' THEN 'N' WHEN '1084716653528248065' THEN 'N' WHEN '1084716653528248066' THEN 'N' WHEN '1084716653528248067' THEN 'N' WHEN '1084716653528248069' THEN 'N' WHEN '1084716653528248073' THEN 'N' WHEN '1084716653528248078' THEN 'N' WHEN '1084716653528248080' THEN 'N' WHEN '1084716653528248084' THEN 'N' WHEN '1084716653528248086' THEN 'N' WHEN '1084716653528248090' THEN 'N' WHEN '1084716653528248093' THEN 'N' WHEN '1084716653528248098' THEN 'N' WHEN '1084716653528248099' THEN 'N' WHEN '1084716653528248101' THEN 'N' WHEN '1084716653528248102' THEN 'N' WHEN '1084716653528248104' THEN 'N' WHEN '1084716653528248106' THEN 'N' WHEN '1084716653528248107' THEN 'N' WHEN '1084716653528248112' THEN 'N' WHEN '1084716653528248113' THEN 'N' WHEN '1084716653528248114' THEN 'N' WHEN '1084716653528248117' THEN 'N' WHEN '1084716653528248119' THEN 'N' WHEN '1084716653528248120' THEN 'N' WHEN '1084716653528248122' THEN 'N' WHEN '1084716653528248123' THEN 'N' WHEN '1084716653528248124' THEN 'N' WHEN '1084716653528248128' THEN 'N' WHEN '1084716653528248130' THEN 'N' WHEN '1084716653528248132' THEN 'N' WHEN '1084716653528248133' THEN 'N' WHEN '1084716653528248137' THEN 'N' WHEN '1084716653528248142' THEN 'N' WHEN '1084716653528248143' THEN 'N' WHEN '1084716653528248145' THEN 'N' WHEN '1084716653528248147' THEN 'N' WHEN '1084716653528248148' THEN 'N' WHEN '1084716653528248153' THEN 'N' WHEN '1084716653528248166' THEN 'N' WHEN '1084716653528248168' THEN 'N' WHEN '1084716653528248169' THEN 'N' WHEN '1084716653528248172' THEN 'N' WHEN '1084716653528248174' THEN 'N' WHEN '1084716653528248183' THEN 'N' WHEN '1084716653528248185' THEN 'N' WHEN '1084716653528248193' THEN 'N' WHEN '1084716653528248204' THEN 'N' WHEN '1084716653528248213' THEN 'N' WHEN '1084716653528248229' THEN 'N' WHEN '1084716653528248230' THEN 'N' WHEN '1084716653528248241' THEN 'N' WHEN '1084716653528248251' THEN 'N' WHEN '1084716653528248268' THEN 'N' WHEN '1084716653528248273' THEN 'N' WHEN '1084716653528248279' THEN 'N' WHEN '1084716653528248281' THEN 'N' WHEN '1084716653528248293' THEN 'N' WHEN '1084716653528248299' THEN 'Y' WHEN '1084716653528248301' THEN 'N' WHEN '1084716653528248310' THEN 'Y' WHEN '1084716653528248311' THEN 'N' WHEN '1084716653528248313' THEN 'Y' WHEN '1084716653528248314' THEN 'N' WHEN '1084716653528248318' THEN 'Y' WHEN '1084716653528248319' THEN 'N' WHEN '1084716653536635904' THEN 'N' WHEN '1084716653536635905' THEN 'Y' WHEN '1084716653536635906' THEN 'N' WHEN '1084716653536635908' THEN 'N' WHEN '1084716653536635923' THEN 'Y' WHEN '1084716653536635927' THEN 'Y' WHEN '1084716653536635928' THEN 'Y' WHEN '1084716653536635929' THEN 'Y' WHEN '1084716653536635934' THEN 'Y' WHEN '1084716653536635935' THEN 'N' WHEN '1084716653536635937' THEN 'Y' WHEN '1084716653536635945' THEN 'Y' WHEN '1084716653536635947' THEN 'Y' WHEN '1084716653536635955' THEN 'Y' WHEN '1084716653536635959' THEN 'N' WHEN '1084716653536635961' THEN 'Y' WHEN '1084716653536635962' THEN 'N' WHEN '1084716653536635966' THEN 'Y' WHEN '1084716653536635967' THEN 'N' WHEN '1084716653536635968' THEN 'N' WHEN '1084716653536635969' THEN 'Y' WHEN '1084716653536635970' THEN 'Y' WHEN '1084716653536635971' THEN 'N' WHEN '1084716653536635973' THEN 'Y' WHEN '1084716653536635977' THEN 'Y' WHEN '1084716653536635978' THEN 'Y' WHEN '1084716653536635980' THEN 'Y' WHEN '1084716653536635982' THEN 'Y' WHEN '1084716653536635983' THEN 'N' WHEN '1084716653536635984' THEN 'N' WHEN '1084716653536635985' THEN 'N' WHEN '1084716653536635987' THEN 'Y' WHEN '1084716653536635988' THEN 'Y' WHEN '1084716653536635989' THEN 'N' WHEN '1084716653536635992' THEN 'Y' WHEN '1084716653536635993' THEN 'Y' WHEN '1084716653536635997' THEN 'N' WHEN '1084716653536635998' THEN 'N' WHEN '1084716653536635999' THEN 'N' WHEN '1084716653536636000' THEN 'N' WHEN '1084716653536636006' THEN 'N' WHEN '1084716653536636007' THEN 'N' WHEN '1084716653536636014' THEN 'N' WHEN '1084716653536636016' THEN 'N' WHEN '1084716653536636017' THEN 'N' WHEN '1084716653536636018' THEN 'N' WHEN '1084716653536636023' THEN 'N' WHEN '1084716653536636024' THEN 'N' WHEN '1084716653536636026' THEN 'N' WHEN '1084716653536636028' THEN 'N' WHEN '1084716653536636029' THEN 'N' WHEN '1084716653536636030' THEN 'N' WHEN '1084716653536636031' THEN 'N' WHEN '1084716653536636032' THEN 'N' WHEN '1084716653536636034' THEN 'N' WHEN '1084716653536636035' THEN 'N' WHEN '1084716653536636036' THEN 'N' WHEN '1084716653536636037' THEN 'N' WHEN '1084716653536636038' THEN 'N' WHEN '1084716653536636040' THEN 'N' WHEN '1084716653536636041' THEN 'N' WHEN '1084716653536636044' THEN 'N' WHEN '1084716653536636045' THEN 'N' WHEN '1084716653536636047' THEN 'N' WHEN '1084716653536636049' THEN 'N' WHEN '1084716653536636050' THEN 'N' WHEN '1084716653536636051' THEN 'N' WHEN '1084716653536636052' THEN 'N' WHEN '1084716653536636053' THEN 'N' WHEN '1084716653536636055' THEN 'N' WHEN '1084716653536636058' THEN 'N' WHEN '1084716653536636063' THEN 'N' WHEN '1084716653536636069' THEN 'N' WHEN '1084716653536636070' THEN 'N' WHEN '1084716653536636071' THEN 'N' WHEN '1084716653536636077' THEN 'N' WHEN '1084716653536636078' THEN 'N' WHEN '1084716653536636087' THEN 'N' WHEN '1084716653536636088' THEN 'N' WHEN '1084716653536636090' THEN 'N' WHEN '1084716653536636093' THEN 'N' WHEN '1084716653536636095' THEN 'N' WHEN '1084716653536636096' THEN 'N' WHEN '1084716653536636097' THEN 'N' WHEN '1084716653536636099' THEN 'N' WHEN '1084716653536636101' THEN 'N' WHEN '1084716653536636102' THEN 'N' WHEN '1084716653536636103' THEN 'N' WHEN '1084716653536636104' THEN 'N' WHEN '1084716653536636105' THEN 'N' WHEN '1084716653536636106' THEN 'N' WHEN '1084716653536636108' THEN 'N' WHEN '1084716653536636110' THEN 'N' WHEN '1084716653536636112' THEN 'N' WHEN '1084716653536636116' THEN 'N' WHEN '1084716653536636117' THEN 'N' WHEN '1084716653536636120' THEN 'N' WHEN '1084716653536636121' THEN 'N' WHEN '1084716653536636122' THEN 'Y' WHEN '1084716653536636124' THEN 'N' WHEN '1084716653536636127' THEN 'N' WHEN '1084716653536636134' THEN 'N' WHEN '1084716653536636137' THEN 'N' WHEN '1084716653536636139' THEN 'N' WHEN '1084716653536636141' THEN 'N' WHEN '1084716653536636149' THEN 'N' WHEN '1084716653536636150' THEN 'N' WHEN '1084716653536636151' THEN 'N' WHEN '1084716653536636153' THEN 'N' WHEN '1084716653536636154' THEN 'N' WHEN '1084716653536636163' THEN 'N' WHEN '1084716653536636164' THEN 'N' WHEN '1084716653536636168' THEN 'N' WHEN '1084716653536636169' THEN 'N' WHEN '1084716653536636175' THEN 'N' WHEN '1084716653536636177' THEN 'N' WHEN '1084716653536636180' THEN 'N' WHEN '1084716653536636185' THEN 'N' WHEN '1084716653536636186' THEN 'N' WHEN '1084716653536636190' THEN 'N' WHEN '1084716653536636192' THEN 'N' WHEN '1084716653536636199' THEN 'N' WHEN '1084716653536636206' THEN 'N' WHEN '1084716653536636207' THEN 'N' WHEN '1084716653536636213' THEN 'N' WHEN '1084716653536636216' THEN 'N' WHEN '1084716653536636219' THEN 'N' WHEN '1084716653536636220' THEN 'N' WHEN '1084716653536636223' THEN 'N' WHEN '1084716653536636224' THEN 'N' WHEN '1084716653536636227' THEN 'N' WHEN '1084716653536636231' THEN 'N' WHEN '1084716653536636234' THEN 'N' WHEN '1084716653536636238' THEN 'N' ELSE frdFirstContractPerson END, FMODIFYTIME = CASE personId WHEN '1084716653528248064' THEN now() WHEN '1084716653528248065' THEN now() WHEN '1084716653528248066' THEN now() WHEN '1084716653528248067' THEN now() WHEN '1084716653528248069' THEN now() WHEN '1084716653528248073' THEN now() WHEN '1084716653528248078' THEN now() WHEN '1084716653528248080' THEN now() WHEN '1084716653528248084' THEN now() WHEN '1084716653528248086' THEN now() WHEN '1084716653528248090' THEN now() WHEN '1084716653528248093' THEN now() WHEN '1084716653528248098' THEN now() WHEN '1084716653528248099' THEN now() WHEN '1084716653528248101' THEN now() WHEN '1084716653528248102' THEN now() WHEN '1084716653528248104' THEN now() WHEN '1084716653528248106' THEN now() WHEN '1084716653528248107' THEN now() WHEN '1084716653528248112' THEN now() WHEN '1084716653528248113' THEN now() WHEN '1084716653528248114' THEN now() WHEN '1084716653528248117' THEN now() WHEN '1084716653528248119' THEN now() WHEN '1084716653528248120' THEN now() WHEN '1084716653528248122' THEN now() WHEN '1084716653528248123' THEN now() WHEN '1084716653528248124' THEN now() WHEN '1084716653528248128' THEN now() WHEN '1084716653528248130' THEN now() WHEN '1084716653528248132' THEN now() WHEN '1084716653528248133' THEN now() WHEN '1084716653528248137' THEN now() WHEN '1084716653528248142' THEN now() WHEN '1084716653528248143' THEN now() WHEN '1084716653528248145' THEN now() WHEN '1084716653528248147' THEN now() WHEN '1084716653528248148' THEN now() WHEN '1084716653528248153' THEN now() WHEN '1084716653528248166' THEN now() WHEN '1084716653528248168' THEN now() WHEN '1084716653528248169' THEN now() WHEN '1084716653528248172' THEN now() WHEN '1084716653528248174' THEN now() WHEN '1084716653528248183' THEN now() WHEN '1084716653528248185' THEN now() WHEN '1084716653528248193' THEN now() WHEN '1084716653528248204' THEN now() WHEN '1084716653528248213' THEN now() WHEN '1084716653528248229' THEN now() WHEN '1084716653528248230' THEN now() WHEN '1084716653528248241' THEN now() WHEN '1084716653528248251' THEN now() WHEN '1084716653528248268' THEN now() WHEN '1084716653528248273' THEN now() WHEN '1084716653528248279' THEN now() WHEN '1084716653528248281' THEN now() WHEN '1084716653528248293' THEN now() WHEN '1084716653528248299' THEN now() WHEN '1084716653528248301' THEN now() WHEN '1084716653528248310' THEN now() WHEN '1084716653528248311' THEN now() WHEN '1084716653528248313' THEN now() WHEN '1084716653528248314' THEN now() WHEN '1084716653528248318' THEN now() WHEN '1084716653528248319' THEN now() WHEN '1084716653536635904' THEN now() WHEN '1084716653536635905' THEN now() WHEN '1084716653536635906' THEN now() WHEN '1084716653536635908' THEN now() WHEN '1084716653536635923' THEN now() WHEN '1084716653536635927' THEN now() WHEN '1084716653536635928' THEN now() WHEN '1084716653536635929' THEN now() WHEN '1084716653536635934' THEN now() WHEN '1084716653536635935' THEN now() WHEN '1084716653536635937' THEN now() WHEN '1084716653536635945' THEN now() WHEN '1084716653536635947' THEN now() WHEN '1084716653536635955' THEN now() WHEN '1084716653536635959' THEN now() WHEN '1084716653536635961' THEN now() WHEN '1084716653536635962' THEN now() WHEN '1084716653536635966' THEN now() WHEN '1084716653536635967' THEN now() WHEN '1084716653536635968' THEN now() WHEN '1084716653536635969' THEN now() WHEN '1084716653536635970' THEN now() WHEN '1084716653536635971' THEN now() WHEN '1084716653536635973' THEN now() WHEN '1084716653536635977' THEN now() WHEN '1084716653536635978' THEN now() WHEN '1084716653536635980' THEN now() WHEN '1084716653536635982' THEN now() WHEN '1084716653536635983' THEN now() WHEN '1084716653536635984' THEN now() WHEN '1084716653536635985' THEN now() WHEN '1084716653536635987' THEN now() WHEN '1084716653536635988' THEN now() WHEN '1084716653536635989' THEN now() WHEN '1084716653536635992' THEN now() WHEN '1084716653536635993' THEN now() WHEN '1084716653536635997' THEN now() WHEN '1084716653536635998' THEN now() WHEN '1084716653536635999' THEN now() WHEN '1084716653536636000' THEN now() WHEN '1084716653536636006' THEN now() WHEN '1084716653536636007' THEN now() WHEN '1084716653536636014' THEN now() WHEN '1084716653536636016' THEN now() WHEN '1084716653536636017' THEN now() WHEN '1084716653536636018' THEN now() WHEN '1084716653536636023' THEN now() WHEN '1084716653536636024' THEN now() WHEN '1084716653536636026' THEN now() WHEN '1084716653536636028' THEN now() WHEN '1084716653536636029' THEN now() WHEN '1084716653536636030' THEN now() WHEN '1084716653536636031' THEN now() WHEN '1084716653536636032' THEN now() WHEN '1084716653536636034' THEN now() WHEN '1084716653536636035' THEN now() WHEN '1084716653536636036' THEN now() WHEN '1084716653536636037' THEN now() WHEN '1084716653536636038' THEN now() WHEN '1084716653536636040' THEN now() WHEN '1084716653536636041' THEN now() WHEN '1084716653536636044' THEN now() WHEN '1084716653536636045' THEN now() WHEN '1084716653536636047' THEN now() WHEN '1084716653536636049' THEN now() WHEN '1084716653536636050' THEN now() WHEN '1084716653536636051' THEN now() WHEN '1084716653536636052' THEN now() WHEN '1084716653536636053' THEN now() WHEN '1084716653536636055' THEN now() WHEN '1084716653536636058' THEN now() WHEN '1084716653536636063' THEN now() WHEN '1084716653536636069' THEN now() WHEN '1084716653536636070' THEN now() WHEN '1084716653536636071' THEN now() WHEN '1084716653536636077' THEN now() WHEN '1084716653536636078' THEN now() WHEN '1084716653536636087' THEN now() WHEN '1084716653536636088' THEN now() WHEN '1084716653536636090' THEN now() WHEN '1084716653536636093' THEN now() WHEN '1084716653536636095' THEN now() WHEN '1084716653536636096' THEN now() WHEN '1084716653536636097' THEN now() WHEN '1084716653536636099' THEN now() WHEN '1084716653536636101' THEN now() WHEN '1084716653536636102' THEN now() WHEN '1084716653536636103' THEN now() WHEN '1084716653536636104' THEN now() WHEN '1084716653536636105' THEN now() WHEN '1084716653536636106' THEN now() WHEN '1084716653536636108' THEN now() WHEN '1084716653536636110' THEN now() WHEN '1084716653536636112' THEN now() WHEN '1084716653536636116' THEN now() WHEN '1084716653536636117' THEN now() WHEN '1084716653536636120' THEN now() WHEN '1084716653536636121' THEN now() WHEN '1084716653536636122' THEN now() WHEN '1084716653536636124' THEN now() WHEN '1084716653536636127' THEN now() WHEN '1084716653536636134' THEN now() WHEN '1084716653536636137' THEN now() WHEN '1084716653536636139' THEN now() WHEN '1084716653536636141' THEN now() WHEN '1084716653536636149' THEN now() WHEN '1084716653536636150' THEN now() WHEN '1084716653536636151' THEN now() WHEN '1084716653536636153' THEN now() WHEN '1084716653536636154' THEN now() WHEN '1084716653536636163' THEN now() WHEN '1084716653536636164' THEN now() WHEN '1084716653536636168' THEN now() WHEN '1084716653536636169' THEN now() WHEN '1084716653536636175' THEN now() WHEN '1084716653536636177' THEN now() WHEN '1084716653536636180' THEN now() WHEN '1084716653536636185' THEN now() WHEN '1084716653536636186' THEN now() WHEN '1084716653536636190' THEN now() WHEN '1084716653536636192' THEN now() WHEN '1084716653536636199' THEN now() WHEN '1084716653536636206' THEN now() WHEN '1084716653536636207' THEN now() WHEN '1084716653536636213' THEN now() WHEN '1084716653536636216' THEN now() WHEN '1084716653536636219' THEN now() WHEN '1084716653536636220' THEN now() WHEN '1084716653536636223' THEN now() WHEN '1084716653536636224' THEN now() WHEN '1084716653536636227' THEN now() WHEN '1084716653536636231' THEN now() WHEN '1084716653536636234' THEN now() WHEN '1084716653536636238' THEN now() ELSE FMODIFYTIME END WHERE personId IN ('1084716653528248064', '1084716653528248065', '1084716653528248066', '1084716653528248067', '1084716653528248069', '1084716653528248073', '1084716653528248078', '1084716653528248080', '1084716653528248084', '1084716653528248086', '1084716653528248090', '1084716653528248093', '1084716653528248098', '1084716653528248099', '1084716653528248101', '1084716653528248102', '1084716653528248104', '1084716653528248106', '1084716653528248107', '1084716653528248112', '1084716653528248113', '1084716653528248114', '1084716653528248117', '1084716653528248119', '1084716653528248120', '1084716653528248122', '1084716653528248123', '1084716653528248124', '1084716653528248128', '1084716653528248130', '1084716653528248132', '1084716653528248133', '1084716653528248137', '1084716653528248142', '1084716653528248143', '1084716653528248145', '1084716653528248147', '1084716653528248148', '1084716653528248153', '1084716653528248166', '1084716653528248168', '1084716653528248169', '1084716653528248172', '1084716653528248174', '1084716653528248183', '1084716653528248185', '1084716653528248193', '1084716653528248204', '1084716653528248213', '1084716653528248229', '1084716653528248230', '1084716653528248241', '1084716653528248251', '1084716653528248268', '1084716653528248273', '1084716653528248279', '1084716653528248281', '1084716653528248293', '1084716653528248299', '1084716653528248301', '1084716653528248310', '1084716653528248311', '1084716653528248313', '1084716653528248314', '1084716653528248318', '1084716653528248319', '1084716653536635904', '1084716653536635905', '1084716653536635906', '1084716653536635908', '1084716653536635923', '1084716653536635927', '1084716653536635928', '1084716653536635929', '1084716653536635934', '1084716653536635935', '1084716653536635937', '1084716653536635945', '1084716653536635947', '1084716653536635955', '1084716653536635959', '1084716653536635961', '1084716653536635962', '1084716653536635966', '1084716653536635967', '1084716653536635968', '1084716653536635969', '1084716653536635970', '1084716653536635971', '1084716653536635973', '1084716653536635977', '1084716653536635978', '1084716653536635980', '1084716653536635982', '1084716653536635983', '1084716653536635984', '1084716653536635985', '1084716653536635987', '1084716653536635988', '1084716653536635989', '1084716653536635992', '1084716653536635993', '1084716653536635997', '1084716653536635998', '1084716653536635999', '1084716653536636000', '1084716653536636006', '1084716653536636007', '1084716653536636014', '1084716653536636016', '1084716653536636017', '1084716653536636018', '1084716653536636023', '1084716653536636024', '1084716653536636026', '1084716653536636028', '1084716653536636029', '1084716653536636030', '1084716653536636031', '1084716653536636032', '1084716653536636034', '1084716653536636035', '1084716653536636036', '1084716653536636037', '1084716653536636038', '1084716653536636040', '1084716653536636041', '1084716653536636044', '1084716653536636045', '1084716653536636047', '1084716653536636049', '1084716653536636050', '1084716653536636051', '1084716653536636052', '1084716653536636053', '1084716653536636055', '1084716653536636058', '1084716653536636063', '1084716653536636069', '1084716653536636070', '1084716653536636071', '1084716653536636077', '1084716653536636078', '1084716653536636087', '1084716653536636088', '1084716653536636090', '1084716653536636093', '1084716653536636095', '1084716653536636096', '1084716653536636097', '1084716653536636099', '1084716653536636101', '1084716653536636102', '1084716653536636103', '1084716653536636104', '1084716653536636105', '1084716653536636106', '1084716653536636108', '1084716653536636110', '1084716653536636112', '1084716653536636116', '1084716653536636117', '1084716653536636120', '1084716653536636121', '1084716653536636122', '1084716653536636124', '1084716653536636127', '1084716653536636134', '1084716653536636137', '1084716653536636139', '1084716653536636141', '1084716653536636149', '1084716653536636150', '1084716653536636151', '1084716653536636153', '1084716653536636154', '1084716653536636163', '1084716653536636164', '1084716653536636168', '1084716653536636169', '1084716653536636175', '1084716653536636177', '1084716653536636180', '1084716653536636185', '1084716653536636186', '1084716653536636190', '1084716653536636192', '1084716653536636199', '1084716653536636206', '1084716653536636207', '1084716653536636213', '1084716653536636216', '1084716653536636219', '1084716653536636220', '1084716653536636223', '1084716653536636224', '1084716653536636227', '1084716653536636231', '1084716653536636234', '1084716653536636238')
11-04
WITH filtered_log AS ( SELECT a.equipmentid, TO_DATE(a.updatetime, 'YYYYMMDD HH24MISS') AS dt, a.alarmtext, TO_DATE(B.SHIFT_DATE, 'YYYYMMDD') AS shift_date, ROW_NUMBER() OVER (PARTITION BY a.equipmentid ORDER BY a.updatetime) AS rn FROM DR01.sdb_tb_alarm_log_table a JOIN SDB_TB_DATE_SHIFT B ON a.updatetime BETWEEN B.starttime AND B.endtime AND B.SHIFT_DATE >= TO_CHAR(sysdate-14,'YYYYMMDD') WHERE a.equipmentid IN ('EDPTC01', 'EDPTC05', 'EDPTC06', 'FMPTC81', 'FDPTC01') AND a.alarmtext != 'Eqp1 Port1 change to Local.' ), lagged_log AS ( SELECT equipmentid, dt, alarmtext, shift_date, rn, LAG(dt) OVER (PARTITION BY equipmentid ORDER BY dt, rn) AS prev_dt FROM filtered_log ), grouped_log AS ( SELECT equipmentid, dt, alarmtext, shift_date, rn, SUM(CASE WHEN (dt - prev_dt) * 24 * 60 > 30 THEN 1 ELSE 0 END) OVER (PARTITION BY equipmentid ORDER BY dt, rn) AS grp FROM lagged_log ), group_summary AS ( SELECT equipmentid, dt AS start_dt, alarmtext, shift_date, grp, COUNT(*) OVER (PARTITION BY equipmentid, grp) AS group_count, MAX(dt) OVER (PARTITION BY equipmentid, grp) AS end_dt, MIN(dt) OVER (PARTITION BY equipmentid, grp) AS min_dt, CASE WHEN COUNT(*) OVER (PARTITION BY equipmentid, grp) > 1 THEN ROUND((MAX(dt) OVER (PARTITION BY equipmentid, grp) - MIN(dt) OVER (PARTITION BY equipmentid, grp)) * 24 * 60, 2) ELSE 10 END AS time , ROW_NUMBER() OVER (PARTITION BY equipmentid, grp ORDER BY dt, rn) AS group_rn FROM grouped_log ) SELECT equipmentid, TO_CHAR(shift_date, 'YYYYMMDD') AS alarm_date, TO_CHAR(start_dt, 'YYYYMMDD HH24MISS') AS starttime, CASE WHEN group_count > 1 THEN TO_CHAR(end_dt, 'YYYYMMDD HH24MISS') ELSE NULL END AS endtime, alarmtext, TIME, CASE WHEN time <= 15 THEN time END AS "<=15", CASE WHEN time > 15 AND time <= 30 THEN time END AS ">15 <=30", CASE WHEN time > 30 AND time <= 60 THEN time END AS ">30 <=60", CASE WHEN time > 60 THEN time END AS ">60" FROM group_summary WHERE group_rn = 1 ORDER BY equipmentid, start_dt; 为什么上面的sql执行出来,据透视表可添加的字段<=15,>15 <=30,>30 <=60,>60 这四列
最新发布
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值