2012-06-06 9 views
5

tengo una tabla llamada tblAccInfo, a continuación es la tabla de datos. Necesito resultados como a continuación.Auto unirse tema

Input 
PolicyNumber BankAc StorageDate VerNum 
400  123  2012-01-01  1 
400  164  2012-01-03  2 
400  860  2012-01-05  3 
6004317654  301  2012-02-05  1 
6004317654  615  2012-03-01  2 
6004317654  253  2012-03-12  3 
6004317654  887  2012-04-03  4 

SALIDA

PolicyNumber IntialBankAc IntialSDate VerNum LatestBankAc LatestSDate VerNum 
400 123   2012-01-01 1  860   2012-01-05 3 
6004317654 301   2012-02-05 1  887   2012-04-03 4 

He tratado con uno mismo a continuación se unen, pero no conseguido. Por favor, ayúdame en esto.

Select DISTINCT 
    P.PolicyNumber, 
    P.BankAc [IntialBankAc], 
    P.StorageDate IntialSDate], 
    P.VerNum, 
    P1.BankAc [LatestBankAc], 
    P1.StorageDate [LatestSDate], 
    P1.VerNum 
FROM tblAccInfo P 
INNER JOIN tblAccInfo P1 
ON P1.PolicyNumber=P.PolicyNumber 
AND (P.BankAc<>P1.BankAc AND P.StorageDate<>P1.StorageDate AND P.VerNum<>P1.VerNum) 
+0

@ Marcos Byers Muchísimas gracias por el formato. – Simhadri

+0

De nada. Por favor, intente hacerlo usted mismo en el futuro sin embargo. –

+0

Lo intenté varias veces, sugiera la mejor manera de formatear tablas especialmente. – Simhadri

Respuesta

4

Prueba esto:

SELECT 
    T1.PolicyNumber, 
    T2.BankAc AS IntialBankAc, 
    T2.StorageDate AS IntialSDate, 
    T2.VerNum AS InitalVerNum, 
    T3.BankAc AS LatestBankAc, 
    T3.StorageDate AS LatestSDate, 
    T3.Vernum AS LatestVerNum 
FROM 
(
    SELECT 
     PolicyNumber, 
     MIN(VerNum) AS MinVerNum, 
     MAX(VerNum) AS MaxVerNum 
    FROM tblAccInfo 
    GROUP BY PolicyNumber 
) AS T1 
JOIN tblAccInfo AS T2 
ON T1.PolicyNumber = T2.PolicyNumber 
AND T1.MinVerNum = T2.VerNum 
JOIN tblAccInfo AS T3 
ON T1.PolicyNumber = T3.PolicyNumber 
AND T1.MaxVerNum = T3.VerNum 

ver su funcionamiento en línea: sqlfiddle

+0

Sí, iba a publicar esto pero me ganaste. Nunca he visto el sqlfiddle antes. Buena característica. – saccharine

+0

Mark Byers Me cansé con diferentes casos de prueba con datos y se ve bien. Muchas gracias por la respuesta. – Simhadri

0

no probado - pero debe darle la idea. (. Puede haber una manera más eficiente de hacerlo - que era sólo el enfoque que saltó a mí)

select initial.policynumber 
,initial.initialbankaccoutn 
,initial.initialstoragedate 
,initial.intialvernum 
,final.latestbankaccount 
,final.lateststoragedate 
,final.latestvernum 
from 
(select a.policynumber, a.bankaccount as initialbankaccount, a.storagedate as initialstoragedate, a.vernum as initialvernum 
from tblAccInfo a1 
    inner join (select min(storagedate) as storagedate, policynumber 
       from tblAccInfo 
       group by policynumber) a 
       on a.policynumber = a1.policynumber 
       and a.storagedate = a1.storagedate) initial 
inner join 
(select b.policynumber, b.bankaccount as latestbankaccount, b.storagedate as lateststoragedate, b.vernum as latestvernum 
from tblAccInfo b1 
    inner join (select min(storagedate) as storagedate, policynumber 
       from tblAccInfo 
       group by policynumber) b 
       on a.policynumber = b1.policynumber 
       and a.storagedate = b1.storagedate) final 
on final.policynumber = initial.policynumber 
1
DECLARE @x TABLE 
(
    PolicyNumber VARCHAR(32), 
    BankAc  INT, 
    StorageDate DATE, 
    VerNum  INT 
); 

INSERT @x VALUES 
('400','123','2012-01-01',1), 
('400','164','2012-01-03',2), 
('400','860','2012-01-05',3), 
('6004317654','301','2012-02-05',1), 
('6004317654','615','2012-03-01',2), 
('6004317654','253','2012-03-12',3), 
('6004317654','887','2012-04-03',4); 

WITH x AS 
(
    SELECT PolicyNumber, BankAc, StorageDate, VerNum, 
     f = ROW_NUMBER() OVER (PARTITION BY PolicyNumber ORDER BY VerNum), 
     l = ROW_NUMBER() OVER (PARTITION BY PolicyNumber ORDER BY VerNum DESC) 
    FROM @x 
) 
SELECT 
    x.PolicyNumber, 
    InitialBankAc = x.BankAc, 
    InitialSDate = x.StorageDate, 
    InitialVerNum = x.VerNum, 
    LatestBankAc = x2.BankAc, 
    LatestSDate  = x2.StorageDate, 
    LatestVerNum = x2.VerNum 
FROM x INNER JOIN x AS x2 
ON x.PolicyNumber = x2.PolicyNumber 
WHERE x.f = 1 AND x2.l = 1 
ORDER BY x.PolicyNumber;