@@myheader.sql

/************************************
*  INPUT PARAMETERS
************************************/
DEFINE tab="&&1"
DEFINE col="&&2"

UNDEFINE owner
UNDEFINE table_name
UNDEFINE col_name

COLUMN  _owner              NEW_VALUE owner            NOPRINT
COLUMN  _table_name         NEW_VALUE table_name       NOPRINT
COLUMN  _col_name           NEW_VALUE col_name         NOPRINT

set term off
SELECT 
      upper(CASE 
                    WHEN INSTR('&&tab','.') > 0 THEN 
                        SUBSTR('&&tab',INSTR('&&tab','.')+1)
                    ELSE
                        '&tab'
            END
            )
              "_table_name"
    , upper(CASE 
                    WHEN INSTR('&&tab','.') > 0 THEN
                        UPPER(SUBSTR('&&tab',1,INSTR('&&tab','.')-1))
                     ELSE
                          user
            END
            )
                "_owner"
    , upper('&&col')
                "_col_name"
FROM DUAL;



set term on

PROMPT
PROMPT *************************************************
PROMPT *  Historical column histogram values           
PROMPT *                                               
PROMPT *  Input Parameters                             
PROMPT *  - owner               = '&&owner'            
PROMPT *  - table_name          = '&&table_name'       
PROMPT *  - col_name            = '&&col_name'         
PROMPT *************************************************

/* ----------------------------------------------------------------------------------|
|Author : Mohamed Houri                                                              |
|Date   : 03/07/2020                                                                 |
|Scope  : This script gives historical column histogram values                       |
|          -- I am using sys.WRI$_OPTSTAT_HISTHEAD_HISTORY for this purpose          |      
|          -- I am only able to say whether, previously, there was HISTOGRAM or not  |
|          -- I can't show the historical type of Histogram                          |
|                                                                                    |                                    |
-------------------------------------------------------------------------------------|*/

col object_name         format a25
col column_name         format a25
col last_analyzed       format a20
col prev_last_analyzed  format a20
col histogram           format a16
col prev_histogram      format a16
WITH sq AS
    (
     SELECT
          object_id
         ,object_name
         ,subobject_name
     FROM
         dba_objects
     WHERE
         object_name    = upper ('&&table_name')
     AND owner          = upper('&&owner')
     AND subobject_name IS NULL
     )
SELECT
     object_name
    ,column_name
    ,lead(prev_histogram,1,histogram) over (order by last_analyzed) histogram
    ,last_analyzed
    ,prev_histogram
    ,prev_last_analyzed
FROM
   (
     SELECT
         object_name
        ,column_name
        ,(select histogram from all_tab_col_statistics where owner = upper('&&owner') 
          and table_name = upper('&&table_name') and column_name = upper('&&col_name')) histogram
        ,last_analyzed
        ,stat_time prev_last_analyzed
        ,row_number() over (order by last_analyzed) rn
        ,case when round(derivedDensity,9)= round(density,9) then 'NONE' else 'HISTOGRAM' end prev_histogram
     FROM
        (
         SELECT
             object_name
            ,column_name
            ,to_char(savtime ,'yyyy-mm-dd hh24:mi:ss')     last_analyzed
            ,to_char(timestamp# ,'yyyy-mm-dd hh24:mi:ss') stat_time
            ,density
            ,1/distcnt derivedDensity
            ,row_number() over (order by savtime) rn
            ,lag(case when round(1/distcnt,9) = round(density,9) then 'NONE' else 'HISTOGRAM' end) over(order by savtime) hist_histogram
         FROM
            sys.WRI$_OPTSTAT_HISTHEAD_HISTORY
            INNER JOIN sq ON object_id = obj#
            INNER JOIN (SELECT 
                            column_id
                           ,column_name
                        FROM
                            dba_tab_columns
                        WHERE
                            column_name = upper('&&col_name')
                        AND table_name  = upper('&&table_name') 
                        AND owner       = upper('&&owner')
                        ) ON intcol# = column_id
    )
WHERE
   rn >= 1 --exlcude/include the very first dbms_stat
   )
ORDER BY
    last_analyzed; 

@@myfooter.sql
