2017-01-14 19 views
-1

Iは、次の(サンプル)データを持つテーブルpointを有する:同じテーブル内の別の列に基づいて空の列を更新

datekey pointkey filter_key t_key        
----------------------------------- 
    (5506061, 37, NULL, 1), 
(5506061, 37, NULL, 1), 
(5506061, 37, NULL, 1), 
(5506061, 37, NULL, 1), 
(5506061, 37, NULL, 1), 
(5506061, 37, NULL, 1), 
(5506763, 37, NULL, 2), 
(5506763, 37, NULL, 2), 
(5506763, 37, NULL, 2), 
(45643, 97, NULL, 2), 
(45643, 97, NULL, 2), 
(45643, 97, NULL, 2), 
(45643, 97, NULL, 2), 
(45643, 97, NULL, 2), 
(45643, 97, NULL, 2), 
(1234, 83, NULL, 1), 
(1234, 83, NULL, 1), 
(1234, 83, NULL, 1), 
(1234, 83, NULL, 1), 
(1234, 83, NULL, 1), 
(1234, 83, NULL, 1), 
(1234, 84, NULL, 1), 
(1234, 84, NULL, 1), 
(1234, 84, NULL, 1), 
(1234, 84, NULL, 1), 
(1234, 84, NULL, 1), 
(1234, 84, NULL, 1), 
(45645, 97, NULL, 1), 
(45645, 97, NULL, 2), 
(45645, 97, NULL, 2), 
(45645, 97, NULL, 2), 
(45645, 97, NULL, 2), 
(45645, 97, NULL, 2) 

上記行の組み合わせは、同じ1~6倍とすることができます。これで、上記の例の最初の6行が好きです。この表には一意のキーはありません。この表には、上記のような数百万行があります。

この表をNULL列(filter_key)を埋めるように更新したいとします。この列では、値1と2が必要です.t_key列の '2'の場合、2もfilter_key列になければなりません。 t_key列の1の場合、最初のレコードの '1'だけを1回だけ欲しければ、他のすべての列は '2'でなければなりません。これは見つけることRow_NumberCASE声明

一度最初のレコード中で「1」を使用して行うことができます

5506061 37  1  1 
5506061 37  2  1 
5506061 37  2  1 
5506061 37  2  1 
5506061 37  2  1 
5506061 37  2  1 
5506763 37  2  2 
5506763 37  2  2 
5506763 37  2  2 
45643 97  2  2 
45643 97  2  2 
45643 97  2  2 
45643 97  2  2 
45643 97  2  2 
45643 97  2  2 
1234 83  1  1 
1234 83  2  1 
1234 83  2  1 
1234 83  2  1 
1234 83  2  1 
1234 83  2  1 
1234 84  1  1 
1234 84  2  1 
1234 84  2  1 
1234 84  2  1 
1234 84  2  1 
1234 84  2  1 
45645 97  1  1 
45645 97  2  2 
45645 97  2  2 
45645 97  2  2 
45645 97  2  2 
45645 97  2  2 
+1

以下の更新クエリを実行する十分ですか? Postgres?オラクル? DB2?ファイアバード? –

+0

't_key'が' 3'または '1'または' 2'以外のときに何が起こるか –

+0

@a_horse_with_no_name ms sql server 2014 – sql123

答えて

1

:だから、上記のコードはに移ししなければならない

最初のレコード私はdatekey,pointkey列で結果を注文して、他の列を使用して結果を注文したい場合は、それをOrder by

SELECT datekey, 
     pointkey, 
     CASE WHEN t_key = 1 AND Row_number()OVER(Partition by datekey,pointkey ORDER BY (select null)) = 1 THEN 1 ELSE 2 END AS filter_key, 
     t_key 
FROM Yourtable 

クエリ上記の結果は、DBMSは、使用している

;with cte as 
(
SELECT datekey, 
     pointkey, 
     filter_key, 
     CASE WHEN t_key = 1 AND Row_number()OVER(Partition by datekey,pointkey ORDER BY (select null)) = 1 THEN 1 ELSE 2 END AS new_filter_key, 
     t_key 
FROM Yourtable 
) 
update cte set filter_key = new_filter_key 
+0

ありがとう私はrextesterに - 私のアンドロイドの携帯電話から作業することができます最後にオンラインのテストプラットフォームで!その周りで遊んでいるとき、私はあなたの美しい答えをもう少し短くすることもできました: 'UPDATE t SET filter_key = new_filter_key FROM(SELECT filter_key、 ケースt_key = 1 AND Row_number()OVER(ORDER BY datekey、pointkey)= 1 THEN 1 ELSE 2 END AS NEW_FILTER_KEY FROM#Table1); t; SELECT * FROM#table1' – cars10m

+0

@ cars10 - あなたにはうれしいです:)ええ派生テーブルの更新も同様に見えます –

+0

あなたの答え@PrdpのTy!結果として、すべてのfilter_key行が '2'として返されます。 – sql123

関連する問題