2011-02-03 48 views
1

我搜索和搜索,似乎無法弄清這個問題: 我們有三個表中有我需要收集並顯示在視圖中的數據。SQL Server 2005查詢通過日期刪除重複

SELECT 
    C.FirstName, C.LastName, 
    aspnet_Membership.LoweredEmail, 
    MAX(Bill.Code) AS BCodes, 
    MAX(Bill.BillDate) 
FROM 
    dbo.Client C 
INNER JOIN 
    dbo.Bill ON C.Id = Bill.BId 
INNER JOIN 
    dbo.aspnet_Membership ON aspnet_Membership.UserId = C.UserGUID 
WHERE 
    ((Bill.Code='ASDF' 
    OR Bill.Code='XYZ' 
    OR Bill.Code='QWE' 
    OR Bill.Code='JKL') 
    AND C.LastName!='Unassigned') 
GROUP BY 
    LastName, FirstName, LoweredEmail, Code, BDate 

客戶表有:FirstName LastName and UserGuid

比爾表有:BCode, BillDate

aspnet_Membership表有:E-mail, UserId

結果:

FirstName LastName E-mail    BCode BillDate 
FName1  Lname1  [email protected]  XYZ  2010-05-13 00:00:00.000 
Fname2  Lname2  [email protected]  XYZ  2010-06-05 00:00:00.000 
Fname2  Lname2  [email protected]  ASD  2008-09-17 12:01:45.407 

正如你可以看到Fname2小號升起兩倍,唯一的區別是在BCodeBillDate

我怎樣才能讓這個去與最新的日期,所以我得到Fname2記錄與XYZ的Bcode與日期2010-06-05。

任何幫助將不勝感激,謝謝你提前。

+0

你的groupby BCode讓你有這種行爲。不知何故,如果你可以從你的groupby中刪除代碼,它應該沒問題。 – 2011-02-03 09:13:12

+0

而且BDate也是。基本上,如果你正在聚合一個列(使用MAX,SUM等),不要把它放在GROUP BY中,反之亦然。 – 2011-02-03 10:34:26

回答

1

執行第二個連接(使用LEFT JOIN)找到比爾表以後的行,然後過濾那個地方成功加入任何結果:

SELECT 
C.FirstName, C.LastName, 
aspnet_Membership.LoweredEmail, 
MAX(Bill.Code) AS BCodes, 
MAX(Bill.BillDate) 

FROM dbo.Client C 

INNER JOIN dbo.Bill 
ON C.Id=Bill.BId 

INNER JOIN dbo.aspnet_Membership 
ON aspnet_Membership.UserId=C.UserGUID 

LEFT JOIN dbo.Bill b2 
ON Bill.BId = b2.BId and 
    b2.Code in ('ASDF','XYZ','QWE','JKL') and 
    b2.BDate > Bill.BDate 

WHERE 
b2.BId is null and 
((Bill.Code='ASDF' 
OR Bill.Code='XYZ' 
OR Bill.Code='QWE' 
OR Bill.Code='JKL') 
AND C.LastName!='Unassigned') 
GROUP BY LastName, FirstName, LoweredEmail, Code, BDate 
+0

謝謝你完美的作品:)。 – AhsenB 2011-02-05 20:06:33

2

看到你正在使用SQL Server 2005,我可能會使用一個CTE(公共表表達式)來做到這一點 - 是這樣的:

;WITH MyData AS 
(
    SELECT 
     c.FirstName, c.LastName, 
     asp.LoweredEmail, 
     b.Code AS BCodes, b.BillDate, 
     ROW_NUMBER() OVER (PARTITION BY c.LastName,c.FirstName 
          ORDER BY BillDate DESC) AS 'RowNum' 
FROM 
    dbo.Client c 
INNER JOIN 
    dbo.Bill b ON C.Id = b.BId 
INNER JOIN 
    dbo.aspnet_Membership asp ON asp.UserId = c.UserGUID 
WHERE 
    b.Code IN ('ASDF', 'JKL', 'QWE', 'XYZ') 
    AND c.LastName != 'Unassigned' 
) 
SELECT 
    FirstName, LastName, LoweredEmail, BCodes, BillDate 
FROM 
    MyData 
WHERE 
    RowNum = 1 

這CTE與ROW_NUMBER()子句:

  • 「分區」您的數據由(FirstName,LastName) - 每對這些值的獲取新的連續的「行號」
  • 爲了每個分區中那些值由下降BillDate

因此而導致的數據集有對於任何(姓名,姓氏)組的每個最新條目與RowNum = 1 - 這就是我從該CTE中選擇的數據。

這是否適合你?