I have a simple table with data as
As we can see that row 1 & 2 contains exact same ColumnA, ColumnB & ColumnC. I want to form a simple select that can ignore the ‘N’ values where we already have a yes, so something like
I tried using self join but guess not using it right or likely not using the right thing.
Can someone drop a little suggestion here?
This is what I am trying
SELECT * FROM [Table] AS main INNER JOIN [Table] AS sub ON sub.columna = main.columna and sub.columnb = main.columnb and sub.columnc = main.columnc WHERE -- This is where I am struggling to add a condition: ((main.columnd = 'Y' AND sub.columnd = 'Y') OR (main.columnd = 'N' AND sub.columnd = 'Y'))
Advertisement
Answer
I suggest using the window function row_number()
to accomplish this. So its partitioning by the columns you want to compare, and ordering by the preferred result
declare @Test table (Col1 varchar(2), Col2 varchar(2), Col3 varchar(2), Col4 varchar(2)); insert into @Test (Col1, Col2, Col3, Col4) values ('AA','BA','CA','Y'), ('AA','BA','CA','N'), ('BB','CD','DA','N'), ('CC','GH','IJ','Y'); select Col1, Col2, Col3, Col4 from ( select Col1, Col2, Col3, Col4 , row_number() over (partition by Col1, Col2, Col3 order by Col4 desc) RowNum from @Test ) X -- To understand how this works comment out the following line where RowNum = 1;
Returns:
Col1 Col2 Col3 Col4 AA BA CA Y BB CD DA N CC GH IJ Y
Note the data displayed as formatted text, and the DDL/DML statements to setup test data.