[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 417
  • Last Modified:

SQL - Looping through duplicate records

I have been posted in previous questions to try to extracts  all the records that have a unique ID.  In my table I have records with same ID, there can one or more records with same ID for each ID.  The output will one record per ID.
However, for each group of these records (i.e. records with same ID),  I have a set of rules to go through to choose one records out of each group.  This has to be done for as many group as available.

I need to be able to represent some logic like this
For each group
while there is more than one record in this group
Begin
if (condition1 meet)
    eliminate this record from the set
else if (condition2 met)
    eliminate this record from  the set
else if (condition3 met)
-- as you can see we can have more condition follow
else
    eliminate this record from  the set
Do
--------------------------------------------------------------------

After I run through this logic, I should get a set of record with unique ID.
I wonder if some one have a good way to structure such a control. and how do you remove a record in my scenario.  Speed is not critical in my case. I have only 20000 records, the condition can be made up multiple fields from the record.
0
tommym121
Asked:
tommym121
  • 6
  • 4
1 Solution
 
ThomasianCommented:
So basically, you want to remove all records that satisfies a set of conditions, right?  if so:
SELECT *
FROM TableName
WHERE NOT (condition 1) AND NOT (condition 2) AND NOT (condition 3)

Open in new window

0
 
tommym121Author Commented:
Thomasian,

I need a structure to go through a table of duplicate records, then for each group of record (that share the same ID) , I have to use a set of condition to eliminate all the record except one within the group.  The result will have one record per ID
0
 
tommym121Author Commented:
I am asking how to put a structure to loop through all the record as well as to filter off all the duplicate records (except 1 remain). within each group based on ID.

I am not good at SQL, not sure how to start.
0
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
ThomasianCommented:
>>After I run through this logic, I should get a set of record with unique ID.
I thought that the conditions will eliminate all duplicates?

If not, how do you eliminate the duplicates? Or do you mean that we ignore these conditions if there are no duplicates?

Some sample data and expected results would help.
0
 
tommym121Author Commented:
--  This is the sample data

IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL
      DROP TABLE #tempTable;


create table #tempTable (
    id      INT,
    active  smallint,
    initial varchar(10)
);
insert into #tempTable values
(11079,0,'U1'),                                                                                                                                                                                  
(11779,1,'U2'),                                                                                                                                                                                  
(12779,1,'U3'),                                                                                                                                                                                    
(13779,0,'AG'),                                                                                                                                                                                        
(13779,0,'KP'),                                                                                                                                                                                          
(13900,1,'GA'),                                                                                                                                                                                          
(13900,1,'JR'),                                                                                                                                                                                          
(14816,1,'GA'),                                                                                                                                                                                          
(14817,1,'LL'),                                                                                                                                                                                            
(14982,0,'GB'),                                                                                                                                                                                            
(14982,1,'MM'),                                                                                                                                                                                          
(14987,1,'GA'),                                                                                                                                                                                            
(14987,1,'GA'),                                                                                                                                                                                          
(15480,1,'GP'),                                                                                                                                                                                            
(15480,0,'ON'),                                                                                                                                                                                            
(16285,0,'CF'),                                                                                                                                                                                        
(16779,1,'U4'),                                                                                                                                                                                  
(16285,1,'LL'),                                                                                                                                                                                            
(16285,1,'GA'),
(16285,1,'GP'),                                                                                                                                                                                            
(16641,1,'GP'),                                                                                                                                                                                            
(16641,0,'GM'),                                                                                                                                                                                  
(17079,0,'U5'),                                                                                                                                                                                  
(16641,1,'RM'),
(16915,0,'KC'),                                                                                                                                                                                      
(16915,1,'MB'),                                                                                                                                                                                            
(16915,0,'NP'),
(17185,1,'LL'),                                                                                                                                                                                            
(17185,1,'LL'),                                                                                                                                                                                            
(17185,1,'LL');


Select * From #tempTable
0
 
ThomasianCommented:
What is the expected output?
0
 
tommym121Author Commented:
-- I put more info.  Hope that help. Thanks.


-- The goal is to generate result with one distinct record per ID
-- A record is unique if the ID is only present in this record not any other records
-- The select algorithim is
--      For any ID that have multiple records
--      we will loop through a set of records with that ID
--      The below critieria will apply to eliminate record till we have one record left for the ID
--            1. Remove record all except one if the initials are the same for all record for that ID
--            1. Remove record with GA
--            2. if there are still more than one records and all record with Active = 1, remove all except one
--            2. if there are still more than one records and all record with Active = 0, remove all except one
--            3. if there are still more than one records, Choose the one with Active = 1
--            4. if all fail choose the first record

-- I have also include the expected result at the bottom.  Thanks for your help.



IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL
      DROP TABLE #tempTable;


create table #tempTable (
    id      INT,
    active  smallint,
    initial varchar(10)
);
insert into #tempTable values
(11079,0,'U1'), -- 11709 is unique only one record                                                                                                                                                                                
(11779,1,'U2'), -- 11779 is unique only one record                                                                                                                                                                                  
(12779,1,'U3'), -- 11779 is unique only one record                                                                                                                                                                                    
(13779,0,'AG'), -- 13779 has duplicate records - choose first one                                                                                                                                                                                      
(13779,0,'KP'),                                                                                                                                                                                          
(13900,1,'GA'), -- 13900 has duplicate records - remove GA and choose the other                                                                                                                                                                                          
(13900,1,'JR'),                                                                                                                                                                                          
(14816,1,'GA'), -- 14816 is unique                                                                                                                                                                                          
(14817,0,'LL'), -- 14817 is unique                                                                                                                                                                                          
(14982,0,'GB'),                                                                                                                                                                                            
(14982,1,'MM'), -- 14982 has duplicate records - choose the one with Active = 1                                                                                                                                                                                          
(14987,1,'GA'), -- 14987 has duplicate records - choose first one since the initials are the same                                                                                                                                                                                            
(14987,1,'GA'),                                                                                                                                                                                          
(15480,1,'GP'), -- 14980 has duplicate records - Choose the one with Active = 1                                                                                                                                                                                            
(15480,0,'ON'),                                                                                                                                                                                            
(16285,0,'CF'), -- 19285 is unique                                                                                                                                                                                      
(16779,1,'U4'), -- 16779 is unique                                                                                                                                                                                  
(16285,1,'LL'), -- 16285 has 4 duplicate records, eliminate (16285,1,'GA') and choose first one from the rest                                                                                                                                                                                        
(16285,1,'GA'),
(16285,1,'GP'),                                                                                                                                                                                            
(16641,1,'GP'), -- 16641 has duplicate records, choose the one with Active = 1  and the frist one from the rest                                                                                                                                                                                        
(16641,0,'GM'),                                                                                                                                                                                  
(17079,0,'U5'), -- 17079 is unique                                                                                                                                                                                
(16641,1,'RM'),
(16915,0,'KC'), -- 19615 has duplicate records, choose the one with Active = 1                                                                                                                                                                                      
(16915,1,'MB'),                                                                                                                                                                                            
(16915,0,'NP'),
(17185,0,'LL'), -- 17185 has duplicate records - choose first one since the initials are the same                                                                                                                                                                                          
(17185,0,'LL'),                                                                                                                                                                                            
(17185,0,'LL');


---------------------------------------------------------------------------
--
-- The expected result
--
--(11079,0,'U1'), -- 11709 is unique only one record                                                                                                                                                                                
--(11779,1,'U2'), -- 11779 is unique only one record                                                                                                                                                                                  
--(12779,1,'U3'), -- 11779 is unique only one record                                                                                                                                                                                    
--(13779,0,'AG'), -- 13779 has duplicate records - choose first one                                                                                                                                                                                      
--(13900,1,'GA'), -- 13900 has duplicate records - remove GA and choose the other                                                                                                                                                                                          
--(14816,1,'GA'), -- 14816 is unique                                                                                                                                                                                          
--(14817,0,'LL'), -- 14817 is unique                                                                                                                                                                                          
--(14982,1,'MM'), -- 14982 has duplicate records - choose the one with Active = 1                                                                                                                                                                                          
--(14987,1,'GA'), -- 14987 has duplicate records - choose first one since the initials are the same                                                                                                                                                                                            
--(15480,1,'GP'), -- 14980 has duplicate records - Choose the one with Active = 1                                                                                                                                                                                            
--(16285,0,'CF'), -- 19285 is unique                                                                                                                                                                                      
--(16779,1,'U4'), -- 16779 is unique                                                                                                                                                                                  
--(16285,1,'LL'), -- 16285 has 4 duplicate records, eliminate (16285,1,'GA') and choose first one from the rest                                                                                                                                                                                        
--(16641,1,'GP'), -- 16641 has duplicate records, choose the one with Active = 1  and the frist one from the rest                                                                                                                                                                                        
--(17079,0,'U5'), -- 17079 is unique                                                                                                                                                                                
--(16915,0,'KC'), -- 19615 has duplicate records, choose the one with Active = 1                                                                                                                                                                                      
--(17185,0,'LL'), -- 17185 has duplicate records - choose first one since the initials are the same                                                                                                                                                                                          

--
0
 
ThomasianCommented:
>>  4. if all fail choose the first record
Please note that this is not possible without a column to indicate which one is the "first record". e.g. a Primary Key

This query will select a random record when "all conditions fail".
SELECT *
FROM
(
	SELECT *
		, rn = ROW_NUMBER() OVER (PARTITION BY id ORDER BY CASE
				WHEN initial <> 'GA' AND active=1 THEN 1
				WHEN initial <> 'GA' THEN 2
				WHEN active = 1 THEN 3
				ELSE 4
				END)
	FROM #tempTable
) T
WHERE rn=1

Open in new window

0
 
tommym121Author Commented:
Thomasian,

Thanks.  I really appreciate your elegant and structure method to pick a record from duplicate.  This is very new to me in SQL programming.  I do a lot of traditional programming.  This ranking is a very neat idea. Never even thought about.  Thanks again for eye opener.
0
 
tommym121Author Commented:
Thanks a lot
0

Featured Post

Take Control of Web Hosting For Your Clients

As a web developer or IT admin, successfully managing multiple client accounts can be challenging. In this webinar we will look at the tools provided by Media Temple and Plesk to make managing your clients’ hosting easier.

  • 6
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now