SQL Server 2005 Query удалить дубликаты по дате - PullRequest
1 голос
/ 03 февраля 2011

Я искал и искал, и не могу решить эту проблему: у нас есть три таблицы, в которых есть данные, которые мне нужно собрать и показать в виде.

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      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.

Как я могу сделать это с самой последней датой, чтобы я получил Fname2 запись с Bcode XYZ с датой 2010-06-05.

Любая помощь будет оценена, спасибозаранее.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Поскольку вы используете SQL Server 2005, я бы, вероятно, использовал для этого CTE (Common Table Expression) - что-то вроде:

;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

Таким образом, результирующий набор данных имеет каждую новейшую запись для любой группы (FirstName, LastName) с RowNum = 1 - и это данные, которые я выбираю из этого CTE.

Это работает для вас ??

1 голос
/ 03 февраля 2011

Выполните второе объединение (используя левое соединение), чтобы найти более позднюю строку в таблице Билла, а затем отфильтруйте все результаты, где это соединение успешно выполнено:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...