Guest User

SQLServer Dup Deletion

a guest
Apr 29th, 2015
302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 3.54 KB | None | 0 0
  1. -- dup text1 and Id
  2. CREATE TABLE #table1 (
  3.       Id INT
  4.     , text1 VARCHAR(50)
  5.     , dtc DATETIME2(0)
  6. );
  7. INSERT INTO #table1 (
  8.       Id
  9.     , text1
  10.     , dtc
  11. )
  12. VALUES
  13.       (1, 'test1', DATEADD(d, -10, GETDATE()))
  14.     , (1, 'test1', DATEADD(d, -7, GETDATE()))
  15.     , (2, 'test2', DATEADD(d, -7, GETDATE()))
  16.     , (2, 'test2', DATEADD(d, -10, GETDATE()))
  17.  
  18. SET ROWCOUNT 1
  19. DELETE FROM #table1 WHERE Id = 1
  20. DELETE FROM #table1 WHERE Id = 2
  21. SET ROWCOUNT 0
  22.  
  23. SELECT * FROM #table1
  24. DROP TABLE #table1
  25.  
  26. -- dup text1 but different primary key
  27. CREATE TABLE #table2 (
  28.       Id INT
  29.     , text1 VARCHAR(50)
  30.     , dtc DATETIME2(0)
  31. );
  32. INSERT INTO #table2 (
  33.       Id
  34.     , text1
  35.     , dtc
  36. )
  37. VALUES
  38.       (1, 'test1.1', DATEADD(d, -10, GETDATE()))
  39.     , (2, 'test1.2', DATEADD(d, -7, GETDATE()))
  40.     , (3, 'test1.1', DATEADD(d, -7, GETDATE()))
  41.     , (4, 'test1.2', DATEADD(d, -10, GETDATE()))
  42.  
  43. SELECT text1
  44. FROM #table2
  45. GROUP BY text1
  46. HAVING COUNT(*) > 1
  47.  
  48. SELECT * FROM #table2
  49.  
  50. DELETE FROM #table2
  51. WHERE Id IN(
  52.     SELECT DISTINCT m1.Id
  53.     FROM #table2 m1
  54.             LEFT JOIN #table2 m2 ON m1.text1 = m2.text1 AND m1.dtc < m2.dtc
  55.     WHERE m2.Id IS NOT NULL
  56. )
  57.  
  58. SELECT * FROM #table2
  59. DROP TABLE #table2
  60.  
  61. -- Dup record with same key, keep distinct data, this one is a problem if you need to maintain the PK
  62. CREATE TABLE #table3 (
  63.       Id INT
  64.     , text1 VARCHAR(50)
  65.     , dtc DATETIME2(0)
  66. );
  67. INSERT INTO #table3 (
  68.       Id
  69.     , text1
  70.     , dtc
  71. )
  72. VALUES
  73.       (1, 'test1.1', DATEADD(d, -10, GETDATE()))
  74.     , (1, 'test1.2', DATEADD(d, -7, GETDATE()))
  75.     , (2, 'test2.1', DATEADD(d, -10, GETDATE()))
  76.     , (2, 'test2.2', DATEADD(d, -7, GETDATE()))
  77.  
  78. SELECT * FROM #table3
  79.  
  80. SELECT DISTINCT text1, dtc
  81. INTO #holdingTable
  82. FROM #table3
  83.  
  84. TRUNCATE TABLE #table3
  85.  
  86. INSERT INTO #table3 (Id, text1, dtc)
  87. SELECT ROW_NUMBER() OVER(ORDER BY text1, dtc), text1, dtc
  88. FROM #holdingTable
  89.  
  90. SELECT * FROM #table3
  91.  
  92. DROP TABLE #table3
  93. DROP TABLE #holdingTable
  94.  
  95. -- dup records with different keys but this can consolidate information
  96. CREATE TABLE #table4(
  97.       Id INT
  98.     , firstName VARCHAR(20)
  99.     , lastName VARCHAR(20)
  100.     , email VARCHAR(50)
  101.     , phone VARCHAR(10)
  102.     , dateOfBirth DATE
  103.     , rating INT
  104. )
  105.  
  106. INSERT INTO #table4 (Id, firstName, lastName, email, phone, dateOfBirth, rating)
  107. VALUES
  108.       (1, 'Jack', 'Smith', NULL, NULL, DATEADD(yy, -30, GETDATE()), 5)
  109.     , (2, 'Jack', 'Smith', '[email protected]', NULL, NULL, 6)
  110.     , (3, 'Jack', 'Smith', NULL, '2145556666', NULL, 2)
  111.     , (4, 'Jill', 'Jones', NULL, NULL, DATEADD(yy, -25, GETDATE()), 1)
  112.     , (5, 'Jill', 'Jones', '[email protected]', NULL, NULL, 10)
  113.     , (6, 'Jill', 'Jones', NULL, '2145557777', NULL, 0)
  114.     , (7, 'Jimmy', 'Jackson', NULL, '2146668877', DATEADD(yy, -45, GETDATE()), 6)
  115.     , (8, 'Jimmy', 'Jackson', '[email protected]', NULL, NULL, 6)
  116.     , (9, 'Jimmy', 'Jackson', '[email protected]', '2145558888', DATEADD(yy, -15, GETDATE()), 5);
  117.  
  118. SELECT * FROM #table4;
  119.  
  120. WITH cte AS (
  121.     SELECT
  122.           Id
  123.         , firstName
  124.         , lastName
  125.         , MAX(email) OVER (PARTITION BY firstName, lastName) AS emailUpdated
  126.         , MAX(phone) OVER (PARTITION BY firstName, lastName) AS phoneUpdated
  127.         , MAX(dateOfBirth) OVER (PARTITION BY firstName, lastName) AS dateOfBirthUpdated
  128.         , ROW_NUMBER() OVER (PARTITION BY firstName, lastName ORDER BY firstName, lastName) AS Rn
  129.         , MIN(rating) OVER (PARTITION BY firstName, lastName) AS ratingUpdated
  130.     FROM #table4
  131. )
  132. SELECT
  133.       Id
  134.     , firstName
  135.     , lastName
  136.     , emailUpdated
  137.     , phoneUpdated
  138.     , dateOfBirthUpdated
  139.     , ratingUpdated
  140.     , Rn
  141. INTO #noDups
  142. FROM cte
  143. WHERE Rn = 1
  144.  
  145. SELECT *
  146. FROM #noDups
  147.  
  148. DROP TABLE #table4
  149. DROP TABLE #noDups
Advertisement
Add Comment
Please, Sign In to add comment