2017-07-26 93 views
-1

這是我的問題;更新重複記錄,保留記錄(Min)(日期)相同

我運行此查詢,並得到那些擁有「FirstTimeBooking」 = 1多行13469個用戶:

Select CustUserId, COUNT(CustUserId) 
FROM Bookings with (nolock) 
WHERE FirstTimeBooking = 1 
GROUP BY CustUserId 
HAVING COUNT(CustUserId) > 1 
ORDER BY COUNT(CustUserId) DESC 

我需要更新所有的這些記錄,對於每一行設置FirstTimeBooking = 0,除了閔( BookingDate)爲每個用戶(這是實際的FirstTimeBooking)。任何幫助將不勝感激。

+0

對需求的一種改變;我需要更新所有記錄,爲每個用戶設置FirstTimeBooking = 0,每個用戶的PER STPT除了Min(BookingDate),他們所在的PER STORE。 即, (用戶可以在多個商店中有FirstTimeBooking,但不是每個商店的多個FirstTimeBookings) – akaWizzmaster

回答

1

我試圖保持它的簡單,並留在你的語法:

CREATE TABLE Bookings 
(
CustUserID int 
,FirstTimeBooking int 
,BookingDate datetime 
) 

INSERT INTO Bookings VALUES 
(1, 1, '20170101') 
,(1, 1, '20170101') -- Duplicate on same date 
,(2, 1, '20170201') 
,(2, 1, '20170301') -- On a second date 
,(3, 1, '20170401') 

UPDATE a 
SET FirstTimeBooking = 0 
FROM Bookings as a 
LEFT OUTER JOIN (
    -- Only CustUserID 1 and 2 
    SELECT CustUserID, min(BookingDate) as BookingDate 
    FROM Bookings 
    WHERE FirstTimeBooking = 1 
    GROUP BY CustUserID 
    HAVING COUNT(*) > 1 
) as b 
on a.CustUserID = b.CustUserID 
and a.BookingDate = b.BookingDate 
WHERE b.BookingDate IS NULL -- only where the first booking date has not been found in subquery 

-- Still got the Problem with CustUserID 
SELECT * 
FROM Bookings 
WHERE CustUserID = 1 

UPDATE b 
set FirstTimeBooking = 0 
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY CustUserID ORDER BY CustUserID) As Rown 
FROM Bookings as b 
WHERE FirstTimeBooking = 1 
) as b 
WHERE Rown = 2 

-- This is now also solved 
SELECT * 
FROM Bookings 
WHERE CustUserID = 1 

也許你沒有兩個完全相同的BookingDates,但我加入這個以防萬一。

Regards tgr

+0

如果您想要按店鋪執行此操作,只需將商店添加到分組中B-) – tgr