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.

