Sql server 2005 SQL Server 2005查询通过日期删除重复项

Sql server 2005 SQL Server 2005查询通过日期删除重复项,sql-server-2005,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

我搜索了又搜索,似乎无法解决这个问题: 我们有三个表,其中包含我需要收集并在视图中显示的数据

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和UserGuid

账单表有:
BCode,BillDate

aspnet_成员资格表有:
E-mail,UserId

结果:

FirstName   LastName   E-mail              BCode    BillDate
FName1      Lname1      fname@isp.com       XYZ      2010-05-13 00:00:00.000
Fname2      Lname2      fname2@isp2.com     XYZ      2010-06-05 00:00:00.000
Fname2      Lname2      fname2@isp2.com     ASD      2008-09-17 12:01:45.407
如您所见,
Fname2
显示两次,唯一的区别在于
BCode
BillDate

如何使其与最新日期保持一致,以便获得日期为2010-06-05、B代码为XYZ的
Fname2
记录

感谢您的帮助。

执行第二次联接(使用左联接)以在账单表中查找下一行,然后筛选联接成功的任何结果:

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

鉴于您使用的是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将:

  • 按(
    FirstName,LastName
    )对数据进行“分区”-每对值都会获得一个新的顺序“行号”
  • 通过降序排列每个分区中的值
    BillDate
因此,生成的数据集包含任何
RowNum=1
的组(FirstName,LastName)的每个最新条目,这就是我从该CTE中选择的数据


这对你有用吗???

你的groupby代码让你有这种行为。不知何故,如果你能从你的groupby中删除代码,那就应该没问题了。还有BDate。基本上,如果要聚合列(使用MAX、SUM等),请不要将其放入GROUP BY,反之亦然。谢谢大家今天晚些时候都会尝试:)。这几乎可以正常工作,但例如,某些用户的名称相同,但GUID不同,因此它将删除这些用户。不过我更喜欢你的编码风格。例如:
Fname4 Lname4email1@test.comASDF 2010-01-20 16:38:15.153947DF57F-DA00-4985-A1AB-E0ABA0F821C2 Fname4 Lname4email2@test.netJKL 2007-10-01 00:00:00.000 195AAFA1-9FA6-4E2E-9B14-F5A5F3D46A53 Fname4 Lname4email3@test1.comJKL 2007-10-01 00:00:00.000 4F64758D-2B09-4624-831F-FDE27C2395D1