计算缺失天数的分数

时间:2014-07-28 22:14:45

标签: sql sql-server tsql sql-server-2012

我有以下历史记录表:

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

2 个答案:

答案 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执行此结果集的左连接。