Reputation: 409
I have a table with data as below
DB DBMS INST SCHEMA TABLE COLUMN HDFT N_Identity Class
IDS TD SBD IDS Data_Val cust_t HIGH
IDS TD SBD IDS Data_Val cust_t GID
IDS TD SBD IDS Data_Val cust_t Phone
IDS TD SBD IDS Data_Val cust_t Account
IDS TD SBD IDS Data_Val cust_t Visa
IDS TD SBD IDS Data_Val cust_t Mail
IDS TD SBD IDS Data_Val cust_t Email
IDS TD SBD IDS Data_Val cust_t Login Yes
TDS TD FDT TDS Expense Exp_t Name LOW
TDS TD FDT TDS Expense Exp_t Yes
I want the output as below:
DB DBMS INST SCHEMA TABLE COLUMN HDFT N_Identity Class
IDS TD SBD IDS Data_Val cust_t GID Yes HIGH
IDS TD SBD IDS Data_Val cust_t Phone Yes HIGH
IDS TD SBD IDS Data_Val cust_t Account Yes HIGH
IDS TD SBD IDS Data_Val cust_t Visa Yes HIGH
IDS TD SBD IDS Data_Val cust_t Mail Yes HIGH
IDS TD SBD IDS Data_Val cust_t Email Yes HIGH
IDS TD SBD IDS Data_Val cust_t Login Yes HIGH
TDS TD FDT TDS Expense Exp_t Name Yes LOW
N_identity will have either Yes or No value for a particular column.So far i have tried to use the below query but it's not giving me the desired result:
SELECT * FROM
(
SELECT * FROM
(
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, MAX(HDFT) as HDFT, MAX(N_Identity) as N_Identity, MAX(Class) as Class
FROM Table
GROUP BY DB,DBMS,INST,SCHEMA,TABLE,COLUMN
)a
UNION
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, HDFT, N_Identity, Class FROM Table
)b
WHERE HDFT IS NOT NULL
AND N_Identity IS NOT NULL
AND Class IS NOT NULL
Also, the HDFT value can be null and below is one scenario:
DB DBMS INST SCHEMA TABLE COLUMN HDFT N_Identity Class
IDS TD SBD IDS Data_Val cust_t No INT
IDS TD SBD IDS Data_Val cust_t INT
IDS TD SBD IDS Data_Val cust_t No
Result Expected:
DB DBMS INST SCHEMA TABLE COLUMN HDFT N_Identity Class
IDS TD SBD IDS Data_Val cust_t No INT
Upvotes: 1
Views: 111
Reputation: 22811
Compute N_Identity
and Class
separately from HDFT
as it looks as their business rules are different. Join the results. HDFT
subquery eliminates NULL
if any non-NULL value is present. It builds on the Sql-server ordering which considers NULL
as a minimum value.
SELECT nic.DB, nic.DBMS, nic.INST, nic.SCHEMA, nic.TABLE, nic.COLUMN
, h.HDFT
nic.N_Identity, nic.Class
FROM
(
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, MAX(N_Identity) as N_Identity, MAX(Class) as Class
FROM Table
GROUP BY DB,DBMS,INST,SCHEMA,TABLE,COLUMN
) nic
JOIN
(
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, max(HDFT) HDFT
FROM
(
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, HDFT
, case when HDFT is null then 1
else dense_rank() over(
partition by DB,DBMS,INST,SCHEMA,TABLE,COLUMN
order by HDFT desc)
end rnk
FROM Table
) t
GROUP BY DB,DBMS,INST,SCHEMA,TABLE,COLUMN, rnk
) h ON h.DB = nic.DB AND h.DBMS = nic.DBMS AND h.INST = nic.INST AND h.SCHEMA = nic.SCHEMA AND h.TABLE = nic.TABLE AND h.COLUMN = nic.COLUMN
Upvotes: 1
Reputation: 60462
In Teradata @SalmanA's answer can be simplified using QUALIFY
SELECT DISTINCT DB, DBMS, INST, SCHEMA, "TABLE", "COLUMN", HDFT,
MAX(N_Identity)
OVER (PARTITION BY DB, DBMS, INST, SCHEMA, "TABLE", "COLUMN") AS N_Identity,
MAX(Class)
OVER (PARTITION BY DB, DBMS, INST, SCHEMA, "TABLE", "COLUMN") as Class
FROM t
QALIFY HDFT IS NOT NULL
OR MAX(HDFT)
OVER (PARTITION BY DB, DBMS, INST, SCHEMA, "TABLE", "COLUMN") IS NULL
Upvotes: 0
Reputation: 37473
You can try below -
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, MAX(HDFT) as HDFT, MAX(N_Identity) as N_Identity, MAX(Class) as Class FROM
(
SELECT * FROM
(
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, MAX(HDFT) as HDFT, MAX(N_Identity) as N_Identity, MAX(Class) as Class
FROM Table
GROUP BY DB,DBMS,INST,SCHEMA,TABLE,COLUMN
)a
UNION
SELECT DB,DBMS,INST,SCHEMA,TABLE,COLUMN, HDFT, N_Identity, Class FROM Table
)b WHERE HDFT IS NOT NULL AND N_Identity IS NOT NULL AND Class IS NOT NULL
GROUP BY DB,DBMS,INST,SCHEMA,TABLE,COLUMN
Upvotes: 0