我在查询合同数据,其中客户的合同被命名和恢复。表中的每一行都有每个合同的客户ID、生效日期和期限日期,因此,如果客户已经恢复合同,客户可以多次出现。我只想让客户出现在一个期限日期,而没有一个新的行与有效的合同。
我现在要做的是:选择所有具有术语日期保存的客户端到电子表格中,选择所有显示活动保存到电子表格中的客户端。
V查找移除在活动电子表格中也出现的所谓客户端。我知道一定有更好的方法。
发布于 2022-05-12 15:37:43
我想你想要这样的东西:
select -- show
c.Client_ID,
c.Effective_Date,
c.Term_Date
from -- all contracts
contracts as c
where -- from clients
not exists -- without
( select 1
from contracts as ac -- active contracts
where ac.Term_Date is null
and ac.Client_ID = c.Client_ID
) ;发布于 2022-05-13 02:04:18
它可能不是一个优雅的解决方案,但您可以在每个分区中使用两个selects和一个ROW_NUMBER()函数,每个分区都是按操作日期排序的。一个查询将恢复,另一个查询将恢复。然后加入client = client和ROW_NUMBER() = ROW_NUMBER()上的两个查询。在第二个查询中有空的是当前活动的客户端。
编辑:在这里扭转我的想法。对不起,误解了你的需要。
发布于 2022-05-13 04:05:29
我推荐这种模式设计模式。我把它叫做历史+电流。
历史表包含每个客户端的许多行;每个合同包含一行。当前表只包含关于每个客户端的“当前”信息--每个客户端一行。您的选择可能只需要此表。
您的设计是“正确的”,因为当前的合同没有冗余地存储在两个地方。我的设计要求在更改两个表时都进行更改。在添加下一个合同时,这是一个小的额外成本,但对SELECT来说是一个很大的收益。
https://dba.stackexchange.com/questions/312044
复制相似问题