Normalize

Translation reference to convert Teradata Normalize functionality to Snowflake

Description

NORMALIZE specifies that period values in the first-period column that meet or overlap are combined to form a period that encompasses the individual period values. For more information about Normalize clause, see the Teradata documentation.

Sample Source Patterns

Sample data

CREATE TABLE project
     (    emp_id        INTEGER,
          project_name  VARCHAR(20),
          dept_id       INTEGER,
          duration      PERIOD(DATE)
     );

INSERT INTO project VALUES (10, 'First Phase', 1000,  PERIOD(DATE '2010-01-10', DATE '2010-03-20') );

INSERT INTO project VALUES (10, 'First Phase', 2000,  PERIOD(DATE '2010-03-20', DATE '2010-07-15') );

INSERT INTO project VALUES (10, 'Second Phase', 2000,  PERIOD(DATE '2010-06-15', DATE '2010-08-18') );

INSERT INTO project VALUES (20, 'First Phase', 2000,  PERIOD(DATE '2010-03-10', DATE '2010-07-20') );

INSERT INTO project VALUES (20, 'Second Phase', 1000,  PERIOD(DATE '2020-05-10', DATE '2020-09-20') );
CREATE TABLE PUBLIC.project
(
     emp_id INTEGER,
     project_name VARCHAR(20),
     dept_id INTEGER,
     duration VARCHAR(24) /*** MSC-WARNING - MSCEWI2053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/
);

INSERT INTO PUBLIC.project VALUES (10, 'First Phase', 1000, PUBLIC.PERIOD_UDF(DATE '2010-01-10', DATE '2010-03-20') /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_UDF' INSERTED. ***/ /*** MSC-WARNING - MSCEWI2053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

INSERT INTO PUBLIC.project VALUES (10, 'First Phase', 2000, PUBLIC.PERIOD_UDF(DATE '2010-03-20', DATE '2010-07-15') /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_UDF' INSERTED. ***/ /*** MSC-WARNING - MSCEWI2053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

INSERT INTO PUBLIC.project VALUES (10, 'Second Phase', 2000, PUBLIC.PERIOD_UDF(DATE '2010-06-15', DATE '2010-08-18') /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_UDF' INSERTED. ***/ /*** MSC-WARNING - MSCEWI2053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

INSERT INTO PUBLIC.project VALUES (20, 'First Phase', 2000, PUBLIC.PERIOD_UDF(DATE '2010-03-10', DATE '2010-07-20') /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_UDF' INSERTED. ***/ /*** MSC-WARNING - MSCEWI2053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

INSERT INTO PUBLIC.project VALUES (20, 'Second Phase', 1000, PUBLIC.PERIOD_UDF(DATE '2020-05-10', DATE '2020-09-20') /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_UDF' INSERTED. ***/ /*** MSC-WARNING - MSCEWI2053 - SNOWFLAKE DOES NOT SUPPORT THE PERIOD DATATYPE, ALL PERIODS ARE HANDLED AS VARCHAR INSTEAD ***/);

Normalize Clause

Suppose you want to use Normalize clause with the employee id.

SELECT NORMALIZE emp_id, duration FROM project
WITH NormalizeCTE AS
(
  SELECT
    T1.*,
    SUM(GroupStartFlag)
    OVER (
    PARTITION BY
      emp_id
    ORDER BY
      duration_begin
    ROWS UNBOUNDED PRECEDING) GroupID
  FROM
    (
      SELECT  
        emp_id,
        duration,
        /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_BEGIN_UDF' INSERTED. ***/
        PUBLIC.PERIOD_BEGIN_UDF(duration) duration_begin,
        /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_END_UDF' INSERTED. ***/
        PUBLIC.PERIOD_END_UDF(duration) duration_end,
        (CASE
          WHEN duration_begin <= LAG(duration_end)
          OVER (
          PARTITION BY
            emp_id
          ORDER BY
            duration_begin,
            duration_end)
            THEN 0
          ELSE 1
        END) GroupStartFlag
      FROM  
        PUBLIC.project
    ) T1
)
SELECT
  emp_id,
  /*** MSC-WARNING - MSCEWI1020 - CUSTOM UDF 'PERIOD_UDF' INSERTED. ***/
  PUBLIC.PERIOD_UDF(MIN(duration_begin), MAX(duration_end))
FROM
  NormalizeCTE
GROUP BY
  emp_id,
  GroupID;

Known Issues

Normalize clause can use ON MEETS OR OVERLAPS, ON OVERLAPS or ON OVERLAPS OR MEETS, for these cases SnowConvert will add an error that this translation is planned for the future.

SELECT NORMALIZE ON MEETS OR OVERLAPS emp_id, duration FROM table1;```sql
SELECT
--       --** MSC-ERROR - MSCEWI1073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'NORMALIZE SET QUANTIFIER' NODE **
--       NORMALIZE ON MEETS OR OVERLAPS
                                      emp_id,
duration FROM
table1;
  • MSCEWI1073: Pending Functional Equivalence Review.

Last updated