2011-08-11 4 views
2

最終的な行の番号を取得し、日付がない場合でも前の行の数をカウントする必要があるSQLテーブルがあります。T-SQLを使用した前回のレコード数のカウント

例えば

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

このテーブルには、このテーブルの第五のレコード

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

ために数5を返す必要がありますが6

事前にありがとうござい

J

を返す必要があります

-----更新------ ほんの少しの情報

テーブルは、その作業の完了単位(マイルストーン)と、作業単位を表す親テーブルへのリンクを表します。マイルストーンテーブルには、日付、親作業ID、マイルストーン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 

希望これは-----私が得た最も近いが、この

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

    FROM 
     Milestone 
    WHERE 
     Milestone.ParentID = 1234 
) AS MilestoneStones 
2 -----

更新

だったのに役立ちます

WHERE 日付はNULLではありません ORDER BY のNum DESC

しかし、大規模なデータセットや他のものがそれに装着することが は私がより良い何かを得ることができることを期待していた非常に遅くなったと

はあなたに

J

+0

最後の行が本当にこのクエリに含まれる必要がありますか?クエリー結果を処理しているコード内のカウントを得ることはできません。 – DoctorMick

+3

そのフィールドがNULLになる行の順序を決定するものは何ですか? ID列はありますか? –

+0

ROW_NUMBER()OVER(ORDER BY ParentID)AS NumはおそらくROW_NUMBER(OVER(ORDER BY ParentID、MilestoneID))でなければなりません。AS Numまたは単にROW_NUMBER()オーバー(ORDER BY MilestoneID)AS Num –

答えて

4

私はつもりですありがとうございましたordと呼ばれる注文列とdtという日付列を仮定する:

naively:

あなたの更新されたデータでは

、これは実行する方法を参照してください。

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

カウント - またはカウントして彼にそれを与える? –

+0

@Jack Marchetti彼らは同じになるでしょう。これは簡単でポータブルです。それを行うためには、より滑らかな方法があります。 –

+0

私はこれを試してみましたが、それと似たようなものがありましたが、5ではなく最初の例が4になりました。 – jQueryNut

1

私はあなたの暗黙のソート順が何であるかわかりません。それは項目が入力される順序ですか?その場合は、IDフィールドを追加してみてください。追加する行ごとにインクリメントされます。特定の行の行番号を把握するには、IDフィールドがターゲット行以下であるレコードを数えます。

あなたが意図している他の並べ替え順がある場合、あなたの例からは分かりません。

+0

もう少し情報を追加しました、ありがとう – jQueryNut

0

あなたの自然な並べ替えは、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行をつかむ必要があり、やけどする微妙な方法があるマルチコラム種類の多くを行います。あなたの単純なカウントはい、あなたは単純化することができるかもしれませんが、私はまた、これはあなたに正しい答えを与えると思います。

関連する問題