建立一个只有 1 个日期的日期范围
Posted
技术标签:
【中文标题】建立一个只有 1 个日期的日期范围【英文标题】:Building a Date Range with only 1 date 【发布时间】:2011-12-03 03:19:47 【问题描述】:在 Oracle 中,我有一个如下表
ID、Acct、ParentID、StartTime、地址、城市、州、邮编
这包含任意给定数量的客户帐户的多行。每当创建客户时,应用程序都会输入一行。每当客户更改其地址时,都会创建一个新行。所以一个客户只能有 1 行或 N 行。
我想做的是创建更有用的报告表,其中包括
ID、Acct、ParentID、StartTime、EndTime、地址、城市、州、邮编
每当创建新地址时,任何超过一行的记录都有 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
【问题讨论】:
你怎么知道两行代表同一个客户账户?我假设 Acct 是一样的,但还有什么其他的吗? Stuart - 是的,Acct 是唯一的字母数字值 感谢 Raihan 的额外标签。新手,来了真的很喜欢这个社区,希望在未来做出贡献。 @DouglasKatz:不客气。另外,由于您是 *** 的新手,我想通知您,您可以通过选中答案旁边的勾号来接受对您最有帮助的答案。 【参考方案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,这意味着只返回每个客户的最后一个地址。因此,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;
【讨论】:
我还会将表中的日期命名为“Created”而不是“StartTime”。这样会更全面。 我希望我可以构建 DDL Olivier,但这是一个我正在尝试挖掘的旧应用程序。您的查询非常适合提供最新的地址,但不幸的是,我试图挖掘的是任何给定地址的每个 Acct 的范围。在我们现在使用的应用程序中,我们只需在添加新地址时将 endDate 记录在 Addr 行中。不过感谢您的回答。 在这种情况下,我认为 NULL EndDate 没有问题,它只是告诉您地址仍然有效,因此没有结束日期。如果您不喜欢这个 NULL 值,请将其替换为实际日期:NVL(myDate,CURRENT_DATE)
。但是你的问题不是很清楚。事实上,你的帖子根本没有问题。你只列出一些事实,让我们猜猜问题是什么。
查看我的编辑。 WHERE 条件也可以是WHERE B.Acct=A.Acct AND B.StartDate>A.StartDate
关于缺少问题的公平点。妥当注明。新手,仍在学习社区,非常感谢您的努力。以上是关于建立一个只有 1 个日期的日期范围的主要内容,如果未能解决你的问题,请参考以下文章