0

助けが必要な編集ルーチンがあります。10 未満の値を「編集済みの詳細」と呼ばれる単一の行に編集しました。ただし、編集された詳細列でもまだ 10 未満である場合があり、10 を超えるまで、編集に追加する次の最小数を取得する必要があります。次のステップは、私を悩ませているものです。リダクションの次の最小値を取得したら、これに寄与した行を削除する必要があります。問題は、この時点でデータ セットの自然キーを持っていないことです。

各サブセットでカーソルを使用することを考えていましたが、できればこれを避けたいです。

私は作業している2つのテーブルを持っています。

    #WorkingTable ( DashboardYear varchar()
                    , Institutition varchar()
                    , StudentLevel varchar()
                    , Field varchar()
                    , FieldDescription varchar()
                    , CountOfStudents varchar()
                   )
    #RedactedValues( DashboardYear Varchar()
                     , Institution Varchar()
                     , StudetnLevel Varchar()
                     , Field Varchar()
                     , FieldDescription Varchar()
                     , CountOfStudents Varchar()
                    )
    Insert INTO #RedactedValues
           SELECT DashboardYear
                  , Institution
                  , StudetnLevel
                  , Field
                  , FieldDescription
                  , CountOfStudents
             From #WorkingTable
           WHERE (CAST(CountOfStudents AS INT) < 10 and CAST(CountOfStudents AS INT) > 0)
             and Field = 'XXXX'
     -- Find Next Lowest Value for each group and add to redacted total
     UPDATE #RedactedValues
        SET CountOfStudents = CAST(r.CountOfStudents AS INT) + CAST(nextValue.nextValueToRedact AS INT)
     FROM
         (SELECT  DashboardYear
                  , Institution
                  , StudentLevel
                  , MIN(CAST(CountOfStudents AS INT)) AS nextValueToRedact
            FROM #WorkingTable t
           WHERE CAST(t.CountOfStudents AS INT) > 0
             and t.Field <> 'XXXX'
             and t.fieldDescription not like '%unknown'
          GROUP BY DashboardYear, Institution, StudentLevel
          ) nextValue
       JOIN #RedactedValues r
         on r.DashboardYear = nextValue.DashboardYear
        and r.Institution = nextValue.Institution
        and r.StudentLevel = nextValue.StudentLevel

上記は、データの各グループの次に小さい整数値を見つけるのに最適で、それを detailsRedacted 行に正しく追加します。しかし、最小値だった行に戻って0に設定する方法がわかりません。

レピュテーションの制限により、まだ画像を追加できません...そのため、データがどのように見えるかを示すことはできません. また、機密性が高いため、データをどこにも投稿できません。

上記のデータ セットを見ると、詳細編集列は 5 しかありません。この 13 のグループ内の値を取得し、それを詳細編集列に追加できます。しかし、DashboardYear、Institution、および StudentLevel しかキーとして持っていないため、リダクションに寄与した単一の行を定義するために必要な Field に到達できません。

update countofstudent = 0 select min(countofStudents) group by 句を実行して完了したかっただけですが、これではうまくいきません。

まだ見たことのない忍者のトリックがあることを願っています。申し訳ありませんが、コードを投稿していませんが、役立つかどうかはわかりません..

4

1 に答える 1

0

ROW_NUMBER() WITH PARTITION と GROUP BY の使用

スタックオーバーフローをトローリングした後、私は単に間違った質問をしていることに気付きました。次のコードを使用して問題を解決できました。

    ---------------------------------------------------------------
    --- Zero added redacted row
    ---------------------------------------------------------------
    WITH e AS 
    (
    SELECT w.DashboardYear
    , w.Institution
    , w.StudentLevel
    , w.Field
    , w.CountOfStudents
    , ROW_NUMBER() OVER
            (PARTITION BY w.DashboardYear
                            , w.Institution
                            , w.StudentLevel
        ORDER BY CAST(w.CountOfStudents AS INT)) ROW

    FROM #WorkingTable w
    JOIN #RedactedValues r
      ON w.dashboardYear = r.DashboardYear
     AND w.Institution = r.Institution
     AND w.studentLevel = r.studentlevel
    WHERE w.field <> @RedactedFieldValue        
      AND w.countofstudents > 0
      AND w.fielddescription NOT LIKE 'Unknown'
    )



    UPDATE #WorkingTable
    SET CountOfStudents = '0'
    FROM e
    JOIN #WorkingTable w
      ON e.dashboardYear = w.dashboardyear
     AND e.institution = w.institution
     AND e.studentlevel = w.studentlevel
     AND e.field = w.field
    WHERE row = 1

行番号パーティションを追加し、カウントで並べ替えることで、特定のデータ グループの次に低い値は常に行番号 1 になると推測できました。

于 2014-02-05T16:13:13.133 に答える