2017-11-03 4 views
0

テーブルがあります - DemoReport - 以下のキーのセットでテーブルを作成しましょう。重複したレコードを特定し、それらのフラグを更新してください

  • YearOfGeneration
  • WeekOfGeneration
  • Key3
  • Key4

最新のレコードを示すフラグの1つの以上の列があります。この列はキーの一部ではありません。このフラグが真の場合、特定のレコードが最新のものです。 レコードがコードによって作成されると、デフォルトではこのフラグはtrueに設定されます。 Key3Key4が同じである、とYearOfGenerationWeekOfGenerationが最新であるべき時に任意のレコードが最新としてマークする必要があります

| *YearOfGeneration* | *WeekOfGeneration* | *Key3*  | *Key4*  | *Latest* 
    | 2017    | 2     | Key3Sample1 | Key4Sample1 | 1 
    | 2017    | 3     | Key3Sample1 | Key4Sample1 | 1 

サンプルレコードは次のようになります。上の例では、2番目のレコードは最新のフラグをtrueに設定し、最初にfalseにする必要があります。

要件最新のものでないレコードに '最新の'フラグを設定しないようにするために、レコードを識別して更新する必要があります。

誰かがSQLの書き方を教えてください。

+0

なぜ最新の行がテーブルそのものの情報を保存したいのですか。これは、ビジネス要件に応じて、「最新の」行を検出するビューまたはクエリの一部である必要があります。我々は通常、集計結果をOLTPシステムのテーブルに格納しません。 –

答えて

0
UPDATE DemoReport 
SET latest = 0 -- Whatever older record should be marked as 
WHERE 
(YearOfGeneration ||LPAD(WeekOfGeneration,2,'0')|| Key3||Key4) 
NOT IN 
(SELECT 
MAX(YearOfGeneration || LPAD(WeekOfGeneration,2,'0'))|| Key3 || Key4 
FROM DemoReport 
GROUP BY Key3, Key4); 

Commit; 
+0

そして、2016年の世代の最大週は10で、2017年の世代の最大週は6です(明らかに同じkey3とkey4の場合)。 –

+0

この回答を書いていただきありがとうございます。はい、私は同意します。このソリューションは、すべての週が同じ年に属する一般的なシナリオで機能します。しかし、1つのレコードの週番号が52、2017年の年、そして他のレコードの週番号は1で、2018年の年があります。 –

+0

同じシナリオでも、Key3とKey4の同じグループに対して201752と201801の間の最大値(LPADは0が追加されます)が除外されます。後者は除外されます。 – AK47

0

あなたは、対応するレコードを更新するために有効なレコードとMERGE文を取得するためにrow_number()を使用することができます。

MERGE INTO DemoReport m 
    USING (SELECT d.*, 
        CASE 
         WHEN  ROW_NUMBER() 
           OVER (
            PARTITION BY key3, key4 
            ORDER BY 
            YearOfGeneration DESC,WeekOfGeneration DESC) != 
            1 
          AND LATEST = 1 
         THEN 
         0 
         ELSE 
         LATEST 
        END 
         new_latest 
       FROM DemoReport d) s 
     ON ( m.key3 = s.key3 
      AND m.key4 = s.key4 
      AND m.WeekOfGeneration = s.WeekOfGeneration) 
WHEN MATCHED 
THEN 
    UPDATE SET m.latest = s.new_latest; 
+0

YearOfGenerationとWeekOfGenerationを連結する理由たとえば、テーブルに2〜11週間があれば正しく動作しません。私はあなたが3つだけでなく4つの主要な列に加わりたいと思っています。 –

+0

@GoranStefanović:ありがとう、私は 'TO_NUMBER'を追加するのを忘れました。しかし、問題はまだそれです。OPが2017年のweek1、week2、week3 ... week52を使用している場合、それだけが動作します。しかし、それがweek1..week4、week1、week2の場合....それはできません。オペラはそれを明確にする必要があります。 –

+0

私は変換を一切使用しません。それはORDER BY YearOfGeneration DESC、WeekOfGeneration DESCだけで十分でしょう。私はOPがWeekOfGenerationの人口構成を明確にする必要があることに同意します。質問に基づいて私の前提は年間1.52人です。 –

関連する問題