我有以下历史记录表:
Create table st_scorehist (stid int , compdate date , compscore decimal(18,4))
Insert into st_scorehist
values(1333 , '2014-07-06', 3.2),
(1333, '2014-07-08',3.6),
(1333, '2014-07-09',3.1),
(1333, '2014-07-13',3.9),
(1337, '2014-07-07',5.9),
(1337, '2014-07-08',5.7),
(1337, '2014-07-11',5.2),
(1337, '2014-07-14',5.3)
此表仅适用于其compscore从之前得分更改的用户。例如,如果stid 1333的得分在7月7日没有变化,那么我们忽略了这个用户因此在历史表中的差距。
现在要求是根据传递的日期值生成报告。如果用户在任何日期都无法获得分数,那么我们需要为该用户填写前一天的compscore。例如,如果查询是在7月14日运行的,则此处是所需的输出。
stid compdate compscore
1333 7/6/2014 3.2
1333 7/7/2014 3.2
1333 7/8/2014 3.6
1333 7/9/2014 3.1
1333 7/10/2014 3.1
1333 7/11/2014 3.1
1333 7/12/2014 3.1
1333 7/13/2014 3.9
1333 7/14/2014 3.9
1337 7/6/2014 NULL
1337 7/7/2014 5.9
1337 7/8/2014 5.7
1337 7/9/2014 5.7
1337 7/10/2014 5.7
1337 7/11/2014 5.2
1337 7/12/2014 5.2
1337 7/13/2014 5.2
1337 7/14/2014 5.3
我在考虑离开加入日历表来生成这些数据但是因为我们需要每个stid所以它变得非常具有挑战性。
感谢任何帮助。
谢谢, NJ
答案 0 :(得分:1)
您可以使用递归CTE为每个stid
生成日期。然后,您可以使用left join
填写值:
with dates as (
select stid, min(compdate) as thedate, max(compdate) as maxcd
from st_scorehist
group by stid
union all
select stid, dateadd(day, 1, thedate), maxcd
from dates
where thedate < maxcd
)
select dates.stid, dates.thedate as compdate,
coalesce(compscore, 0) as compscore
from dates left outer join
st_scorehist sh
on sh.compdate = dates.thedate and sh.stid = dates.stid;
Here是一个SQL小提琴。
答案 1 :(得分:0)
基于日历表的LEFT JOIN是正确的方法。但是你还必须针对不同的stid进行交叉连接,然后根据stid和compdate对st_scorehist执行此结果集的左连接。