最后一个记录的SQL总和X记录的总和

最后一个记录的SQL总和X记录的总和,sql,sql-server-2008,Sql,Sql Server 2008,我已经找了一段时间,但我找不到这个问题的答案,也许我没有找到正确的术语或其他东西。基本上,我有一个数据库,每个日期有任意数量的条目。我需要计算过去X天中包含条目的天数的总和,忽略没有条目的天数。我知道如何计算每天的总数 假设我有一张叫做收益率的表: UnitID Date TestTime NumMeasured NumPassing 1 2013-04-05 10:15 25 3 2 2013-03-31 10:1

我已经找了一段时间,但我找不到这个问题的答案,也许我没有找到正确的术语或其他东西。基本上,我有一个数据库,每个日期有任意数量的条目。我需要计算过去X天中包含条目的天数的总和,忽略没有条目的天数。我知道如何计算每天的总数

假设我有一张叫做收益率的表:

UnitID  Date        TestTime    NumMeasured NumPassing
1       2013-04-05  10:15       25          3
2       2013-03-31  10:12       30          1
3       2013-03-30  10:12       26          2
4       2013-03-29  10:30       11          1
5       2013-03-31  10:20       6           2
6       2013-04-05  10:30       5           0
然后我使用以下查询:

SELECT DISTINCT 
    Date, 
    (
        SELECT SUM([NumMeasured]) 
        FROM [dbo].[Yield] T1 
        WHERE T1.Date = T2.Date
    ) AS 'NumMeasured', 
    (
        SELECT SUM([NumPassing]) 
        FROM [dbo].[Yield] T1 
        WHERE T1.Date = T2.Date
    ) AS 'NumPassing' 
FROM [dbo].[Yield] T2 
要获得每天的总通过率/测量值:

Date        NumMeasured NumPassing
2013-03-29      11          1
2013-03-30      26          2
2013-03-31      36          3
2013-04-05      30          3
然后,我需要一个查询,我可以在某个日期调用它,比如我在4/05调用它,它获取最后一个包含条目的Xsay 100天,并返回这许多天的NumMeasured和NumPassing列的总和。我不能让这部分工作,我一直遇到SQL问题,我没有足够的经验来解决。我在找像这样的东西

SELECT
    (
        SELECT TOP 100 SUM(T3.[NumMeasured]) 
        FROM T3 
        WHERE T3.Date <= '4/05/2013' 
        ORDER BY T3.Date
    ) AS 'NumMeasured', 
    (
        SELECT TOP 100 SUM(T3.[NumPassing]) 
        FROM T3 
        WHERE T3.Date <= '4/05/2013' 
        ORDER BY T3.Date
    ) AS 'NumPassing', 
    (
        SELECT DISTINCT 
            Date, 
            (
                SELECT SUM([NumMeasured]) 
                FROM [PhaseNoiseMonitoring].[dbo].[Yield] T1 
                WHERE T1.Date = T2.Date
            ) AS 'NumMeasured', 
            (
                SELECT SUM([NumPassing]) 
                FROM [PhaseNoiseMonitoring].[dbo].[Yield] T1 
                WHERE T1.Date = T2.Date
            ) AS 'NumPassing' 
        FROM [PhaseNoiseMonitoring].[dbo].[Yield] T2 
    )
AS T3

我意识到这是完全错误的,但我真的不知道如何让它起作用。

要得到你最后的100次约会

SELECT TOP(100) DISTINCT date FROM yield ORDER BY date desc
您可以使用以下简单的方法简化第一个查询

SELECT date, SUM(passing) as numpassing, SUM(Measured) as nummeasured
FROM yield
GROUP BY date
如果你需要从现在到100天前的金额

SELECT SUM(passing) as npassing, SUM(measured) as nmeasured
FROM yield
WHERE date >= DATEADD(d,100,CURRENT)
如果你需要过去100次约会的总和

SELECT SUM(passing) as npassing, SUM(measured) as nmeasured
FROM yield
WHERE date IN (SELECT TOP 100 date FROM yield WHERE date <= '04/05/2013' ORDER BY date desc) 

下面是一个使用相关子查询的想法:

with bydays as (<your query here>)
select bd.*,
       (select sum(NumMeasured) from (select top 100 * from bydays bd2 where bd2.date <= bd.date order by date desc) t
       ) as Measured100,
       (select sum(NumPassingd) from (select top 100 * from bydays bd2 where bd2.date <= bd.date order by date desc) t
       ) as Measured100
from bydays

除非我遗漏了什么,否则在我看来,按条款分组可以大大简化你的生活。所以你需要最后100次约会的总和。。不一定要在100天内求和?谢谢,这正是我所需要的,除了少数的打字错误,感谢快速的响应,我以前没有使用过相关的子查询,但这似乎比我之前所讲的要容易得多。@Gordon Linoff当你需要在多个值之间进行聚合时,比如说,在上面Matt的例子中,按UnitID进行分组,你会怎么做?
with bydays as (<your query here>)
select bd.*,
       (select sum(NumMeasured) from (select top 100 * from bydays bd2 where bd2.date <= bd.date order by date desc) t
       ) as Measured100,
       (select sum(NumPassingd) from (select top 100 * from bydays bd2 where bd2.date <= bd.date order by date desc) t
       ) as Measured100
from bydays