仅使用1个日期构建日期范围

时间:2011-12-03 03:19:47

标签: sql oracle plsql

在Oracle中

我有一个如下表

ID,Acct,ParentID,StartTime,Address,City,State,Zip

这包含任意给定数量的客户帐户的多行。每当创建客户时,应用程序都会输入一行。每当客户更改其地址时,都会创建一个新行。因此,客户只能有1行或N行。

我要做的是创建更有用的报告表,其中包括

ID,Acct,ParentID,StartTime,EndTime,Address,City,State,Zip

每当创建新地址时,多行具有EndTime的任何记录。只有一条记录的客户将留下NULL EndTime。

提前致谢

我开发的解决方案更新 - 感谢输入所有这些我想出的

select 
  ID           ,
  ACCOUNT_NO         ,
  PARENTID
  STARTTIME              ,
 MAX(mod_t)OVER( ORDER BY poid_id0 ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) as END_T,
  ADDRESS            ,
  CITY               ,
  FIRST_NAME         ,
  LAST_NAME          ,
  STATE              ,
  ZIP

1 个答案:

答案 0 :(得分:1)

SELECT Adr.ID, Adr.Acct, X.FromDate, Adr.StartTime AS ToDate, Adr.Address, ...
FROM
    Adr INNER JOIN
    (SELECT MAX(ID) AS ActualAdrID, MIN(StartTime) As FromDate FROM Adr GROUP BY Acct) X
        ON Adr.ID = X.ActualAdrID;

我将帐户的地址(我猜一个帐户是一个客户)分组到X.我还假设ID是每个新记录递增的主键。 X将保留一个客户的最后一个ID和第一个StartTime。然后将地址连接到x,这意味着只返回每个cutomer的最后一个地址。因此,Adr.StartTime是最后一个StartTime。第一个StartTime取自子查询X。


编辑:

SELECT
    A.ID,
    A.Acct,
    A.StartTime,
    (SELECT MIN(B.StartDate) FROM Adr B WHERE B.Acct=A.Acct AND B.ID>A.ID) AS EndDate,
    A.Address,
    ...
FROM Adr A;