2017-05-12 63 views
0

如何將相同的rownumber分配給一組序列記錄。參閱下面的例子orderno.s 550 & 650具有兩組運行序列號 我想分配給每個對應的訂單編號相同行號,並設置序列號(1,2,3)teradata sql查詢分配相同的rownumbers

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 

預期結果應該與下面填寫的新的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

感謝dnoeth,你的解決方案爲我... – geo

回答

0

從現有的表中,您需要創建一個ALTER語句,以便您可以添加新的列。

ALTER TABLE mytableName ADD Rownumber INT;

語句已經成功執行後,您現在可以更新所有的記錄,

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

編輯: 我很樂意幫助與(一些邏輯語句...),但我不完全確定你要從你的問題中尋找什麼。

+0

我不關心添加列,我正在尋找邏輯來填充rownumber列(我的意思是將相同的rownumber分配給每組運行順序和orderno。 – geo

+0

能否請你解釋一下下面的代碼做什麼... 總和(標誌) - 創建組號 在(PARTITION BY訂單,項目 ORDER BY無論 ROWS無界之前) – 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; 

更新:

更新SQL根據@dnoeth's comment刪除冗餘複雜性:

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; 

導致:

results

+0

這太複雜了:'Row_Number()Over(PARTITION BY OrderNumber,SequenceNumber ORDER BY SequenceNumber)AS RowNumber'返回相同的結果,不嵌套:-) – dnoeth

+0

它確實如此。我已經更新了答案。 – Turgs