2

次のようなデータベースがあります。

label_id, scan_type, scan_cost

そして、次のような行がいくつかあります。

001, A40, 70
001, A40, 70
002, A40, 85
003, A40, 85
003, A40, 85

次のような結果セットを生成する必要があります。

001, A40, 70
001, A40, 0
002, A40, 85
003, A40, 85
003, A40, 0

つまり、同じ列が複数回出現するlabel_id場合は、scan_cost列を 0 に設定する必要がありますが、各label_id値の最初の出現はそのままにしておく必要があります。

それlabel_idが何かを変更する場合、それらは連続していません。

SQLでこの動作を実現することは可能ですか? SQL ダイアレクトは T-SQL、Microsoft SQL Server 2008 であることに注意してください。

4

1 に答える 1

6

このクエリは、探しているものを返します。

SELECT
    label_id
,   scan_type
,   CASE WHEN row_number() OVER (PARTITION BY label_id ORDER BY scan_type)=1
        THEN scan_cost
        ELSE 0
    END
FROM test
ORDER BY label_id, scan_type

このソリューションの背後にあるアイデアは、データを で分割し関数label_idを使用して保持するデータを決定することです。ROW_NUMBER

サブ節で使用scan_typeしましたが、これは理想的ではありません。ORDER BY実際のテーブルに、タイムスタンプ列など、最初の行を決定するのにより適したデータを含む列がある場合は、代わりにその他の列を使用する必要があります。外側の 2 番目の列はorder by、内側の列と同じである必要がありますorder by

sqlfiddleに関するこのクエリへのリンクを次に示します。

于 2012-10-14T04:36:22.517 に答える