根据日期(或日期范围)加入

dre*_*lax 3 postgresql join database-design

我不确定我是否完全捏造了我的小型爱好数据库的设计(无论如何我都不是 DBA),但我有一个这样的表(主键是(staffid, effectivefrom)):

 staffid | target | effectivefrom
 --------|--------|---------------
  1      |  6.0   | 2012-01-01
  2      |  6.0   | 2012-01-01
  3      |  6.0   | 2012-01-01
  1      |  7.0   | 2012-03-01
Run Code Online (Sandbox Code Playgroud)

所以基本上,三名员工都是以 6.0 的目标开始的,但是在 3 月份,ID 1 的员工有了新的 7.0 目标。我想维护历史目标,因为它与其他表中的其他数据相关。

我想有一个用户定义的函数,它以日期为参数,这个函数需要根据日期将上表与另一个表连接起来。假设以 2 月 1 日为日期调用该函数,我希望联接的结果包括显示所有员工 6.0 的目标列。

像这样(我认为这行不通,因为之前可能有多行dateParameter):

 SELECT othertable.*, targets.target
     FROM othertable
     JOIN targets ON
         othertable.staffid = targets.staffid AND
         targets.effectivedate <= dateParameter;
Run Code Online (Sandbox Code Playgroud)

请让我知道我是否做了一个绝对的 DBA 'no-no' 或者我是否只需要一些咖啡因。

Con*_*lls 5

您需要选择您感兴趣的日期之前或当天的最新记录。类似于以下内容的查询将执行此操作。

declare @date datetime
select @date = '2012-02-01'

select t.StaffID
      ,t.Target
  from Targets t
  join (select StaffID
              ,max (EffectiveFrom)    as EffectiveFrom
          from targets
         where EffectiveFrom <= @date  -- Most recent record before this date
         group by StaffID) ct 
    on ct.StaffID = t.StaffID
   and ct.EffectiveFrom = t.EffectiveFrom
Run Code Online (Sandbox Code Playgroud)

不幸的是,我手头没有正在运行的 PostgreSQL 实例,所以这是在 SQL Server 上,但相同的基本结构应该适用于 PostgreSQL。