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