使用T-SQL计算以前记录的数量

时间:2011-08-11 15:38:44

标签: sql-server tsql count

我有一个SQL表格,我需要获取带有日期的最后一行的数字,并计算前一行的数量,即使他们没有任何日期。

e.g

02/01/2011
03/01/2011
09/01/2011
NULL
10/10/2011
NULL

此表应返回第5条记录的数字

NULL
NULL
NULL
09/01/2011
NULL
10/10/2011
NULL

此表应返回6

提前谢谢

Ĵ

-----更新------ 再多一点信息

表格本身代表完成的工作单元(里程碑)以及指向表格工作单元的父表格的链接。在里程碑表中,它包含日期,父工作ID和milsestone ID。

从第一个例子

ParentID    MilestoneID    Date
1234        123            02/01/2011
1234        124            03/01/2011
1234        125            09/01/2011
1234        126            NULL
1234        127            10/10/2011
1234        128            NULL

希望这有帮助

-----更新2 -----

我最接近的是这个

SELECT TOP 1
    Num
FROM
    (
    SELECT
        ROW_NUMBER()OVER(ORDER BY ParentID) AS Num,
        Date

    FROM
        Milestone
    WHERE
        Milestone.ParentID = 1234
) AS MilestoneStones

WHERE     日期不是NULL 订购     Num DESC

但是随着大数据集和其他附加内容的增加,它变得非常缓慢 希望我能得到更好的东西

谢谢

Ĵ

3 个答案:

答案 0 :(得分:4)

我将假设一个名为ord的排序列和一个名为dt的日期列:

天真:

SELECT COUNT(*)
FROM tbl
WHERE ord <= (SELECT MAX(ord) FROM tbl WHERE dt IS NOT NULL)

使用您的更新数据,请查看其执行情况:

http://data.stackexchange.com/stackoverflow/q/109223/

DECLARE @tbl AS TABLE (ParentID INT, MilestoneID INT, [Date] DATETIME);
INSERT INTO @tbl VALUES (1234,        123,            '02/01/2011');
INSERT INTO @tbl VALUES (1234,        124,            '03/01/2011');
INSERT INTO @tbl VALUES (1234,        125,            '09/01/2011');
INSERT INTO @tbl VALUES (1234,        126,            NULL);
INSERT INTO @tbl VALUES (1234,        127,            '10/10/2011');
INSERT INTO @tbl VALUES (1234,        128,            NULL);

WITH LastCompleted AS (
    SELECT ParentID, MAX(MilestoneID) AS MAXMilestoneID
    FROM @tbl AS Milestone
    WHERE [Date] IS NOT NULL
    GROUP BY ParentID
)
SELECT LastCompleted.ParentID, COUNT(*) AS NumMilestones
FROM LastCompleted
INNER JOIN @tbl AS Milestone
    ON LastCompleted.ParentID = Milestone.ParentID
    AND LastCompleted.MAXMilestoneID >= Milestone.MilestoneID
GROUP BY LastCompleted.ParentID;

答案 1 :(得分:1)

我不确定你隐含的排序顺序是什么。它是输入物品的顺序吗?如果是这样,请尝试添加标识字段。对于您添加的每一行,它都会递增。要计算出特定行的行号,只需对其标识字段小于或等于目标行的记录进行计数。

如果你有其他的排序顺序,那么你的例子就不清楚了。

答案 2 :(得分:0)

需要有一个Order by和你的自然排序我是ParentID,MilestoneID,语法比你猜测的要复杂。如果没有Order By子句,则无法保证排序(即使表具有集群PK)。 Cade我喜欢你的回答,我勾选了它,但我无法在评论中发布代码示例。

    SELECT COUNT(*)
    FROM tbl
    WHERE ParentID <= (SELECT MAX(ParentID) FROM tbl WHERE dt IS NOT NULL) 
    Or ( ParentID = (SELECT MAX(ParentID) FROM tbl WHERE dt IS NOT NULL)  
         And MilestoneID <= (Select MAX (MilestoneID) FROM tbl  
             where ParentID = (SELECT MAX(ParentID) FROM tbl WHERE dt IS NOT NULL)
             And dt IS NOT NULL)
        )
    Order By ParentID, MilestoneID

我知道有一个简化这个的诱惑,但我做了很多多列排序,我需要抓住下一个X行,并有一些微妙的方法来烧掉。对于你的简单计数是的,你可以简化,但我也认为这会给你正确答案。