5

我有一个名为 tblAccInfo 的表,下面是表数据。我需要像下面这样的输出。

Input
PolicyNumber    BankAc   StorageDate    VerNum
6003210400      123      2012-01-01     1
6003210400      164      2012-01-03     2
6003210400      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

输出

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

我尝试过以下自我加入,但没有成功。请帮我解决这个问题。

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)
4

3 回答 3

4

试试这个:

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

在线查看它:sqlfiddle

于 2012-06-06T21:45:04.740 回答
1
DECLARE @x TABLE 
(
  PolicyNumber VARCHAR(32), 
  BankAc       INT, 
  StorageDate  DATE, 
  VerNum       INT
);

INSERT @x VALUES
('6003210400','123','2012-01-01',1),
('6003210400','164','2012-01-03',2),
('6003210400','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;
于 2012-06-06T21:57:25.253 回答
0

未经测试 - 但应该给你的想法。(可能有一种更有效的方法来做到这一点——这只是我突然想到的方法。)

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
于 2012-06-06T21:44:55.417 回答