Is there a way to evaluate data in a table to derive if in a set of ProductIDs a PRODUCTID passed or failed? Here is an example of my data:
DECLARE @example TABLE (ID INT NOT NULL, PRODUCTID INT, PASSED BIT, LEVEL INT, CREATEDATE DATETIME, PRIMARY KEY (ID))
INSERT INTO @example VALUES
( 1, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 2, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 3, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 4, 100, 1, 1, '2016-01-10 07:35:02.123' )
,( 5, 101, 1, 1, '2016-01-10 07:35:02.123' )
,( 6, 102, 0, 1, '2016-01-10 07:35:02.123' )
,( 7, 102, 1, 2, '2016-01-10 07:35:02.123' )
,( 8, 103, 1, 1, '2016-01-10 10:35:02.123' )
,( 9, 103, 1, 2, '2016-01-10 09:35:02.123' )
,( 10, 103, 1, 2, '2016-01-10 08:35:02.123' )
,( 11, 103, 1, 3, '2016-01-10 07:35:02.123' )
Is it possible to structure a query that returns:
PRODUCTID ISPASSED
100 0
101 0
102 0
103 1
The conditions are there needs to be 2 PASSED for 2 different LEVELS for a given PRODUCTID.
- 100 is a 0 because all 4 records are for LEVEL 1
- 101 is a 0 because there is only 1 PASS and for only 1 LEVEL
- 102 is a 0 because one record PASSED and the other failed
- 103 is a 1 because there are 2 PASSED records for different LEVELS.
Thanks so much!
EDIT:
I have come up with this query, but it comes up short because I am only able to qualify first part of the requirements:
WITH cte(PRODUCTID, ISPASSED) AS
(
SELECT PRODUCTID, CASE WHEN SUM(CONVERT(INT, PASSED)) = 2 THEN 1 ELSE 0 END AS ISPASSED
FROM (SELECT PRODUCTID, RowNumber = ROW_NUMBER() OVER(PARTITION BY PRODUCTID ORDER BY CREATEDATE DESC), LEVEL, PASSED
FROM @example
GROUP BY PRODUCTID, LEVEL, CREATEDATE, PASSED) as agg
WHERE RowNumber <=2
GROUP BY PRODUCTID
)
select * from cte