我有一个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
但是随着大数据集和其他附加内容的增加,它变得非常缓慢 希望我能得到更好的东西
谢谢
Ĵ
答案 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行,并有一些微妙的方法来烧掉。对于你的简单计数是的,你可以简化,但我也认为这会给你正确答案。