2013-06-20 4 views
0

Я действительно застреваю Я создаю временную таблицу, в которой хранится список клиентов, их последняя дата подписания политики и какой тип бизнес-источника.SQL Выберите ID с самой последней датой

Я пытаюсь выяснить, что является последним источником для тысяч клиентов.

DROP TABLE #TEMP 

CREATE TABLE #TEMP([user] INT, [policySignedDateTime] DATETIME, [BS] INT) 

INSERT INTO #TEMP 
SELECT TOP (100) PERCENT 
    dbo.tblCustomerUser.IdentityID, 
    MAX(dbo.tblApplication.PolicySignedDateTime) AS 'last', 
    (dbo.tblApplication.BusinessSourceID) AS BS 
FROM dbo.tblApplication 
INNER JOIN dbo.tblCustomerUser 
    ON dbo.tblApplication.CustomerUserID = dbo.tblCustomerUser.IdentityID 
INNER JOIN dbo.tblIndividual 
    ON dbo.tblCustomerUser.IdentityID = dbo.tblIndividual.IdentityID 
    WHERE (dbo.tblApplication.BusinessSourceID in (1,11)) 
    AND (dbo.tblApplication.PolicySignedDateTime is not null) 
    AND (dbo.tblCustomerUser.IdentityID = 54456) 
GROUP BY 
    dbo.tblCustomerUser.IdentityID, 
    dbo.tblIndividual.FirstNames, 
    dbo.tblIndividual.LastName, 
    dbo.tblApplication.BusinessSourceID 

Результат выглядит это для одного пользователя

  • 54456 // 2012-12-12 00: 00: 00,000 // 1
  • 54456 // 2012-01-09 00: 00: 00.000 // 11

Так что в основном я пытаюсь вернуть только верхний ряд, поскольку это самая последняя дата.

Любые советы были бы замечательными!

+1

Try [Rank] (http://msdn.microsoft.com/en-us/library/ms176102.aspx) - 'RANK() OVER ([partition_by_clause ] order_by_clause) ' – zx8754

+0

Спасибо, что это было именно то, что мне нужно! – Bobby

ответ

2

Используйте выражение commnon таблицы и window function как ROW_NUMBER или DENSE_RANK:

WITH CTE AS 
(
    SELECT dbo.tblcustomeruser.identityid, 
      Max(dbo.tblapplication.policysigneddatetime)OVER( 
       partition BY dbo.tblcustomeruser.identityid, 
          dbo.tblindividual.firstnames, 
          dbo.tblindividual.lastname, 
          dbo.tblapplication.businesssourceid) AS 'last', 
     dbo.tblapplication.businesssourceid AS BS, 
     Row_number() OVER (
       partition BY dbo.tblcustomeruser.identityid, 
          dbo.tblindividual.firstnames, 
          dbo.tblindividual.lastname, 
          dbo.tblapplication.businesssourceid 
       ORDER BY dbo.tblapplication.policysigneddatetime DESC) AS RN 
    FROM dbo.tblapplication 
     INNER JOIN dbo.tblcustomeruser 
       ON dbo.tblapplication.customeruserid = 
        dbo.tblcustomeruser.identityid 
     INNER JOIN dbo.tblindividual 
       ON dbo.tblcustomeruser.identityid = dbo.tblindividual.identityid 
    WHERE (dbo.tblapplication.businesssourceid IN (1, 11)) 
     AND (dbo.tblapplication.policysigneddatetime IS NOT NULL) 
     AND (dbo.tblcustomeruser.identityid = 54456) 
) 
SELECT * 
FROM CTE 
WHERE RN = 1 
+0

Спасибо за ответ, я действительно не понимаю, как использовать этот код. Я новичок. Я собираюсь использовать предложенный метод ранжирования zx8754. Приветствую друга – Bobby

0

Я использую метод ранжирования - zx8754 предложил.

Теперь код выглядит следующим образом

DROP TABLE #TEMP 

CREATE TABLE #TEMP([user] INT, [policySignedDateTime] DATETIME, [BS] INT) 

INSERT INTO #TEMP 
SELECT  TOP (100) PERCENT dbo.tblCustomerUser.IdentityID, MAX(dbo.tblApplication.PolicySignedDateTime) AS 'last', (dbo.tblApplication.BusinessSourceID) AS BS, rank() OVER (Partition by MAX(dbo.tblCustomerUser.IdentityID) order by MAX(dbo.tblApplication.PolicySignedDateTime)desc) as ranking 
FROM   dbo.tblApplication INNER JOIN 
        dbo.tblCustomerUser ON dbo.tblApplication.CustomerUserID = dbo.tblCustomerUser.IdentityID INNER JOIN 
        dbo.tblIndividual ON dbo.tblCustomerUser.IdentityID = dbo.tblIndividual.IdentityID 
        WHERE (dbo.tblApplication.BusinessSourceID in (1,11)) 
        and (dbo.tblApplication.PolicySignedDateTime is not null) 
        and (dbo.tblCustomerUser.IdentityID = 54456) 
GROUP BY dbo.tblCustomerUser.IdentityID, dbo.tblIndividual.FirstNames, dbo.tblIndividual.LastName, dbo.tblApplication.BusinessSourceID 
Смежные вопросы