FIRST_VALUE, LAST_VALUE 생각한데로 답이 안나오네요. 0 2 1,400

by 농부지기 [2019.10.07 11:39:48]


아래SQL문장 출력결과
2623   Y   2019.09.25   B,  Y
2623   B   2019.09.26   B,  B
2623   B   2019.09.27   B,  B
----
제각 생각했던 출력결과
2623   Y   2019.09.25   B,  B
2623   B   2019.09.26   B,  B
2623   B   2019.09.27   B,  B

이유>  일자를 DESC 후 FIRST_VALUE()
            일자를 ASC 후 LAST_VALUE() 
           위와 같은 기준이기에 ..값은 값이 나올거라 예상했는데.. 왜 다르게 나올까요?


WITH V_VB AS
   ( SELECT '2623' AS RSTR_CD, 'B' SIGNL_LIGHT, '20190927' AS REGI_DTIME FROM DUAL UNION ALL
     SELECT '2623' AS RSTR_CD, 'B' SIGNL_LIGHT, '20190926' AS REGI_DTIME FROM DUAL UNION ALL
     SELECT '2623' AS RSTR_CD, 'Y' SIGNL_LIGHT, '20190925' AS REGI_DTIME FROM DUAL
   )
SELECT VB.*
     , FIRST_VALUE(VB.SIGNL_LIGHT) OVER (PARTITION BY VB.RSTR_CD ORDER BY VB.REGI_DTIME DESC) AS FIST_SIGNL_LIGHT
     , LAST_VALUE(VB.SIGNL_LIGHT) OVER  (PARTITION BY VB.RSTR_CD ORDER BY VB.REGI_DTIME ASC)  AS LAST_SIGNL_LIGHT
  FROM V_VB VB;

 

by jkson [2019.10.07 11:51:02]

first_value, last_value 의 window clause를 적지 않으면 기본적으로 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW가 됩니다.

20190925 기준 ascending일 때 마지막 값은 현재 row의 signl_light값 Y입니다.


by 신이만든지기 [2019.10.07 15:26:09]

저도 예전에 정리해 놓은 게 있습니다.

참고하시라는 의미에서 링크합니다. (블로그 홍보 아님;;)

https://www.jigi.net/?p=4607

https://www.jigi.net/?p=4696

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입