2012-06-06 5 views
5

Ich habe eine Tabelle namens tblAccInfo, unten ist die Tabelle Daten. Ich brauche Ausgabe wie unten.Self-Join-Problem

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 

OUTPUT

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 

ich versucht haben, unter sich selbst verbinden, aber gelang nicht. Bitte hilf mir dabei.

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

@Mark Byers Vielen Dank für die Formatierung. – Simhadri

+0

Gern geschehen. Bitte versuchen Sie es in Zukunft selbst. –

+0

Ich habe es ein paar Mal versucht, bitte schlagen Sie am besten vor, Tabellen besonders zu formatieren. – Simhadri

Antwort

4

Try this:

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 

anzeigen online arbeiten: sqlfiddle

+0

Ja, ich wollte das hier posten, aber du hast mich dazu geschlagen. Habe den Squelfiddle noch nie gesehen. Coole Funktion. – saccharine

+0

Mark Byers Ich bin müde mit verschiedenen Testfällen mit Daten und es sieht gut aus. Vielen Dank für die Antwort. – Simhadri

0

nicht getestet - aber sollte Ihnen die Idee geben. (. Es kann ein effizienter Weg, dies zu tun - es war nur der Ansatz, sprang auf mich)

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;