Advertisement
swePeso

Untitled

Mar 30th, 2017
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 2.98 KB | None | 0 0
  1. -- Prevent unwanted resultsets back to client
  2. SET NOCOUNT ON;
  3.  
  4. -- Prepare staging table
  5. CREATE TABLE    #Customers
  6.         (
  7.             FirstName VARCHAR(50) NOT NULL,
  8.             LastName VARCHAR(50) NULL,
  9.             StreetAddress VARCHAR(50) NULL,
  10.             ZipCode INT NULL,
  11.             Email VARCHAR(50) NULL,
  12.             CreditCard CHAR(19) NULL,
  13.             CustomerID INT NOT NULL
  14.         );
  15.  
  16. /*
  17.     http://sqlmag.com/sql-server/what-you-need-know-about-batch-mode-window-aggregate-operator-sql-server-2016-part-1
  18. */
  19. CREATE NONCLUSTERED COLUMNSTORE INDEX NCI_Purchases ON dbo.Purchases(PurchaseID) WHERE PurchaseID = -1 AND PurchaseID = -2;
  20.  
  21. -- Empty this solutions table
  22. TRUNCATE TABLE  dbo.Customers;
  23.  
  24. -- Populate staging table with earliest PurchaseID for all unique three possible matching cases
  25. -- About 2 seconds
  26. WITH ctePreaggregate(FirstName, LastName, StreetAddress, ZipCode, Email, CreditCard, CustomerID)
  27. AS (
  28.     SELECT      p.FirstName,
  29.             p.LastName,
  30.             p.StreetAddress,
  31.             p.ZipCode,
  32.             p.Email,
  33.             p.CreditCard,
  34.             MIN(p.PurchaseID) AS CustomerID
  35.     FROM        dbo.Purchases AS p WITH (TABLOCK)
  36.     GROUP BY    GROUPING SETS
  37.             (
  38.                 (
  39.                     FirstName,
  40.                     Email
  41.                 ),
  42.                 (
  43.                     FirstName,
  44.                     CreditCard
  45.                 ),
  46.                 (
  47.                     FirstName,
  48.                     LastName,
  49.                     StreetAddress,
  50.                     ZipCode
  51.                 )
  52.             )
  53. )
  54. INSERT      #Customers WITH (TABLOCK)
  55.         (
  56.             FirstName,
  57.             LastName,
  58.             StreetAddress,
  59.             ZipCode,
  60.             Email,
  61.             CreditCard,
  62.             CustomerID
  63.         )
  64. SELECT      MAX(c.FirstName) AS FirstName,
  65.         MAX(c.LastName) AS LastName,
  66.         MAX(c.StreetAddress) AS StreetAddress,
  67.         MAX(c.ZipCode) AS ZipCode,
  68.         MAX(c.Email) AS Email,
  69.         MAX(c.CreditCard) AS CreditCard,
  70.         c.CustomerID
  71. FROM        ctePreaggregate AS c
  72. GROUP BY    c.CustomerID;
  73.  
  74. -- Populate Customer table with all purchases and earliest CustomerID
  75. -- About 3 seconds
  76. INSERT      dbo.Customers WITH (TABLOCK)
  77.         (
  78.             PurchaseID,
  79.             CustomerID
  80.         )
  81. SELECT      p.PurchaseID,
  82.         MIN(    CASE
  83.                 WHEN e.CustomerID <= x.CustomerID AND e.CustomerID <= cc.CustomerID THEN e.CustomerID
  84.                 WHEN x.CustomerID <= e.CustomerID AND x.CustomerID <= cc.CustomerID THEN x.CustomerID
  85.                 ELSE cc.CustomerID
  86.             END) AS CustomerID
  87. FROM        dbo.Purchases AS p WITH (TABLOCK)
  88. INNER JOIN  #Customers AS e WITH (TABLOCK) ON e.FirstName = p.FirstName
  89.             AND e.Email = p.Email
  90. INNER JOIN  #Customers AS x WITH (TABLOCK) ON x.FirstName = p.FirstName
  91.             AND x.LastName = p.LastName
  92.             AND x.StreetAddress = p.StreetAddress
  93.             AND x.ZipCode = p.ZipCode
  94. INNER JOIN  #Customers AS cc WITH (TABLOCK) ON cc.FirstName = p.FirstName
  95.             AND cc.CreditCard = p.CreditCard
  96. GROUP BY    p.PurchaseID;
  97.  
  98. -- Iterate the Network Connected Graph
  99. -- About 1 second
  100. WHILE @@ROWCOUNT > 0
  101.     UPDATE  f
  102.     SET f.OriginalCustomerID = f.NewCustomerID
  103.     FROM    (
  104.             SELECT      c1.CustomerID AS OriginalCustomerID,
  105.                     c2.CustomerID AS NewCustomerID
  106.             FROM        dbo.Customers AS c1
  107.             INNER JOIN  dbo.Customers AS c2 ON c2.PurchaseID = c1.CustomerID
  108.                         AND c2.CustomerID < c2.PurchaseID
  109.         ) AS f;
  110.  
  111. -- Clean up
  112. DROP INDEX NCI_Purchases ON dbo.Purchases;
  113. DROP TABLE  #Customers;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement