Need T-SQL Query to get duplicate values for same group set of values

SQL9 246 Reputation points
2022-07-22T04:30:29.937+00:00

Hi All,

I have a query result set with 4 columns - ID, TypeId, TypeName , CreateDate

My source query result looks in below format.

ID TypeID TypeName CreateDate
1 1 Type-A 01/01/2002
2 1 Type-B 01/10/2002
3 1 Type-B 01/15/2002
4 1 Type-C 01/16/2002
5 2 Type-A 01/20/2002
6 2 Type-A 01/25/2004
7 2 Type-B 01/25/2004
8 2 Type-C 05/29/2004
9 3 Type-A 01/25/2003
10 3 Type-C 03/10/2004
11 3 Type-C 07/21/2004
12 4 Type-A 01/25/2003
13 4 Type-B 03/10/2004
14 4 Type-C 07/21/2004
15 5 Type-A 07/25/2006
16 5 Type-B 02/10/2007
17 6 Type-A 09/15/2014
18 6 Type-A 11/10/2014
19 6 Type-A 01/21/2015

Below are the rules to get required rows.

From TypeId = 1, need ID = 2, 3 rows because TypeName values - "B" are same, and skip ID=1,4
From TypeId = 2, need ID = 5, 6 rows because TypeName values - "A" are same, and skip ID=7,8
From TypeId = 3, need ID = 10,11 rows because TypeName values - "C" are same, and skip ID=9
From TypeId = 4, need 0 rows because TypeName values are unique.
From TypeId = 5, need 0 rows because TypeName values are unique.
From TypeId = 6, need ID = 17,18,19 (all 3) rows because TypeName values - "A" are same

Output result should be in below format.

ID TypeID TypeName CreateDate
2 1 Type-B 01/10/2002
3 1 Type-B 01/15/2002
5 2 Type-A 01/20/2002
6 2 Type-A 01/25/2004
10 3 Type-C 03/10/2004
11 3 Type-C 07/21/2004
6 2 Type-A 01/25/2004
10 3 Type-C 03/10/2004
11 3 Type-C 07/21/2004
17 6 Type-A 09/15/2014
18 6 Type-A 11/10/2014
19 6 Type-A 01/21/2015

Create Table #MySample ( ID int , TypeID int , TypeName varchar(10), CreateDate date)

insert into #MySample Values
(1, 1 , 'Type-A' , '01/01/2002'),
(2 , 1 , 'Type-B' , '01/10/2002'),
(3 , 1 , 'Type-B' , '01/15/2002'),
(4 , 1 , 'Type-C' , '01/16/2002'),
(5 , 2 , 'Type-A' , '01/20/2002'),
(6 , 2 , 'Type-A' , '01/25/2004'),
(7 , 2 , 'Type-B' , '01/25/2004'),
(8 , 2 , 'Type-C' , '05/29/2004'),
(9 , 3 , 'Type-A' , '01/25/2003'),
(10 , 3 , 'Type-C' , '03/10/2004'),
(11 , 3 , 'Type-C' , '07/21/2004'),
(12 , 4 , 'Type-A' , '01/25/2003'),
(13 , 4 , 'Type-B' , '03/10/2004'),
(14 , 4 , 'Type-C' , '07/21/2004'),
(15 , 5 , 'Type-A' , '07/25/2006'),
(16 , 5 , 'Type-B' , '02/10/2007'),
(17 , 6 , 'Type-A' , '09/15/2014'),
(18 , 6 , 'Type-A' , '11/10/2014'),
(19 , 6 , 'Type-A' , '01/21/2015')

Thanks in advance for your help.
RH

Developer technologies | Transact-SQL
{count} votes

Accepted answer
  1. Wilko van de Velde 2,236 Reputation points
    2022-07-22T06:40:02.123+00:00
    WITH CTE_Duplicates AS  
    (  
    SELECT	   
    		TypeID, 	  
    		TypeName  
    FROM	#MySample  
    GROUP BY 		   
    		TypeID,  
    		TypeName  
    HAVING	Count(1) > 1  
    )  
      
    SELECT	*   
    FROM	#MySample S  
    INNER JOIN CTE_Duplicates D  
    ON		S.TypeID = D.TypeID  
    AND		S.TypeName = D.TypeName  
    

2 additional answers

Sort by: Most helpful
  1. Tom Cooper 8,481 Reputation points
    2022-07-22T07:40:51.137+00:00

    Another way

    ;WITH CTE_Duplicates AS  
    (  
    SELECT       
            ID,  
    	    TypeID,       
            TypeName,  
    	    CreateDate,  
    	    COUNT(*) OVER(PARTITION BY TypeID, TypeName) AS Cnt  
    FROM    #MySample  
    )  
      
    SELECT   
        ID  
    	TypeID,  
    	TypeName,  
    	CreateDate, cnt  
    FROM CTE_Duplicates  
    WHERE Cnt > 1;  
    

  2. Bert Zhou-msft 3,436 Reputation points
    2022-07-22T08:16:41.063+00:00

    If you don't want to use cte, subquery is also a good choice:

    SELECT   
         ID  
         TypeID,  
         TypeName,  
         CreateDate, cnt  
     FROM   
     (  
    	 SELECT       
             ID,  
             TypeID,       
             TypeName,  
             CreateDate,  
             count(*) OVER(PARTITION BY TypeID, TypeName) AS Cnt  
     FROM    #MySample  
       
     )A  
     where cnt>1  
    

    Bert Zhou


Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.