2017-05-12 9 views
0

シーケンスのレコードのグループに同じrownumberを割り当てる方法。以下の例では、550 & 650 Iは、各対応ORDERNUMBERに対して同じ行番号を割り当てたいと思ったと(1,2,3)同じロー番号を割り当てるためのteradata sqlクエリ

Order, Item, SequenceNumber 
550,  AA,  1 
550,  AA,  2 
550,  AA,  3 

550,  AA,  1 
550,  AA,  2 
550,  AA,  3 
550,  AA,  4 

650,  AA,  1 
650,  AA,  2 
650,  AA,  3 

650,  AA,  1 
650,  AA,  2 
650,  AA,  3 
650,  AA,  4 

シーケンス番号のセット予想 シーケンス番号を実行している二組があるorderno.s参照次のように新しいrownumber列が設定された結果が返されます。

Order, Item, SequenceNumber , Rownumber 
550,  AA,  1,      1 
550,  AA,  2,      1 
550,  AA,  3,      1 

550,  AA,  1,      2 
550,  AA,  2,      2 
550,  AA,  3,      2 
550,  AA,  4,      2 

650,  AA,  1,      1 
650,  AA,  2,      1 
650,  AA,  3,      1 

650,  AA,  1,      2 
650,  AA,  2,      2 
650,  AA,  3,      2 
650,  AA,  4,      2 
+0

... – geo

答えて

0

既存のテーブルから、新しい列を追加できるようにALTER文を作成する必要があります。

ALTER TABLE mytableName ADD Rownumber INT;

ステートメントが正常に実行された後、あなたは今、すべてのレコードを更新することができ、

UPDATE myTableName SET Rownumber = (some logic statement depending on table values)

編集: 私はそれを支援させていただきます(一部のロジック声明...)、しかし私はあなたの質問からあなたが探しているものが正確ではない。

+0

私は列を追加懸念していないよ、私は移入するためのロジックを探していますrownumber列(私は、実行順序と順序の各セットに同じrownumberを割り当てることを意味します。 – geo

+0

あなたは以下のコードが何をするか... 和(フラグ)を説明していただけます - グループ番号 を作成するオーバー(先行無制限どんな ROWS BY受注、アイテム ORDER BY PARTITION) – geo

+0

私はどのように本当にわからないんだけど大文字(旗)は大文字小文字の上に新しいグループ番号を作成します。 – geo

2

あなたは、ネストされたOLAP機能を必要とするが、もちろん、あなたのデータを注文するためにいくつかの列がなければならない。ここで

SELECT ... 
    Sum(flag) -- create the group number 
    Over (PARTITION BY Order, Item 
        ORDER BY whatever 
        ROWS Unbounded Preceding) 
FROM 
(
    SELECT ... 
     -- find the row where a new group starts 
     CASE WHEN Min(SequenceNumber) 
       Over (PARTITION BY Order, Item 
         ORDER BY whatever 
         ROWS BETWEEN 1 Preceding AND 1 Preceding) + 1 = SequenceNumber 
      THEN 0 
      ELSE 1 
     END AS flag 
    FROM tab 
) AS dt 
0

はSQLです:

SELECT 
    OrderNumber 
, ItemCode 
, SequenceNumber 
, ROW_NUMBER() OVER(PARTITION BY OrderNumber, SequenceNumber, SequenceNumberCount) AS RowNumber 
FROM 
(
    SELECT 
     OrderNumber 
    , ItemCode 
    , SequenceNumber 
    , COUNT(SequenceNumber) OVER(PARTITION BY OrderNumber, SequenceNumber ORDER BY OrderNumber, ItemCode) AS SequenceNumberCount 
    FROM 
    (
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
     SELECT 550 AS OrderNumber, 'AA' As ItemCode, 4 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
     SELECT 650 AS OrderNumber, 'AA' As ItemCode, 4 AS SequenceNumber 
    ) AS data 
) AS interim_calculation 
ORDER BY 
    OrderNumber 
, RowNumber 
, SequenceNumber; 

は、更新:更新

@dnoeth's commentに基づいて冗長性を排除するSQL:

になり
SELECT 
    OrderNumber 
, ItemCode 
, SequenceNumber 
, Row_Number() Over(PARTITION BY OrderNumber, SequenceNumber ORDER BY SequenceNumber) AS RowNumber 
FROM 
(
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
    SELECT 550 AS OrderNumber, 'AA' As ItemCode, 4 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 1 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 2 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 3 AS SequenceNumber UNION ALL 
    SELECT 650 AS OrderNumber, 'AA' As ItemCode, 4 AS SequenceNumber 
) AS data 
ORDER BY 
    OrderNumber 
, RowNumber 
, SequenceNumber; 

:おかげでdnoeth、あなたのソリューションは、私のために働いた

results

+0

それはあまりにも複雑です: 'Row_Number()オーバー(PARTITION BY OrderNumber、SequenceNumber ORDER BY SequenceNumber)AS RowNumber'はネストされていない同じものを返す:-) – dnoeth

+0

それは確かです。私は答えを更新しました。 – Turgs

関連する問題