2011-08-11 69 views
2

我有一個SQL表,我需要使用日期獲取最後一行的編號,並計算以前行的數量,即使它們中沒有日期也是如此。使用T-SQL計算以前記錄的數量

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

此表應歸還號碼5的第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 日期不爲空 ORDER BY 民DESC

但隨着大型數據集和其他的東西附加到它,它變得非常慢 希望我能得到更好的東西

謝謝

Ĵ

+0

是否最終行真的需要在此查詢?你是否能夠在處理查詢結果的代碼中獲得計數,無論這可能是什麼。 – DoctorMick

+3

什麼決定了該字段可以爲NULL的行的順序?有沒有ID列? –

+0

ROW_NUMBER()OVER(ORDER BY PARENTID)爲num或許應該ROW_NUMBER()OVER(ORDER BY PARENTID,MilestoneID)爲num或只是ROW_NUMBER()OVER(ORDER BY MilestoneID)爲num –

回答

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; 
+0

我覺得他需要ROWNUMBER不伯爵 - 或將數數給他? –

+0

@Jack Marchetti他們會一樣的。這很簡單,便攜。有很多方法可以做到。 –

+0

我曾經嘗試這樣做(或非常類似的東西),但它給了我4第一個例子並不5. – jQueryNut

1

我不知道您的隱含的排序順序是什麼。這是項目輸入的順序嗎?如果是這樣,請嘗試添加標識字段。它會增加你添加的每一行。要找出特定行的行號,只需對其標識字段小於或等於目標行的記錄進行計數。

如果您還有其他排序順序,那麼您的示例並不清楚。

+0

我添加了更多信息,謝謝 – jQueryNut

0

需要有通過訂單和您的自然排序我是PARENTID,MilestoneID和語法是棘手比你可能已經猜到了。沒有一個Order By子句,沒有保證的排序(即使表中有一個簇PK)。凱德我喜歡你回答,我勾選了它,但我無法在評論中發佈代碼示例。

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行,有微妙的方式被燙傷。爲了簡單計數,你可以簡化,但我也認爲這會給你正確的答案。