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' 或者我是否只需要一些咖啡因。
您需要选择您感兴趣的日期之前或当天的最新记录。类似于以下内容的查询将执行此操作。
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。
归档时间: |
|
查看次数: |
17994 次 |
最近记录: |