2013-10-16 48 views
1

我正在查詢哪裏需要檢索ID和值的列表。teradata sql作爲單個值出現多次

然後,我需要爲具有多個值的ID轉換新值。

例如:

ID   COLOR 
1   BLUE 
1   GREEN 
2   ORANGE 

我想回是這樣的:

ID   COLOR 
1   MULTIPLE 
2   ORANGE 

到目前爲止,我已經使用ROW_NUMBER()和OVER(PARTITION BY)檢索所有結果併爲它們編號。

但後來我卡住了圈子。

我可以限制那些有多個事件的ID(行數大於等於2),並且我得到那些需要轉換爲「MULTIPLE」的ID。

但是:如果我限制爲只有一個值(= 1)的ID,那麼這些相同的值也會包括在內,因爲多個值ID也有一個行號1.我結束了一個無效的結果,因爲我是計數多值標識兩次,有點像這樣:

ID   COLOR 
1   BLUE 
1   MULTIPLE 
2   ORANGE 

所以,問題是:我怎麼能得到所有具有多個值的ID,從那些只有一個值分開?

+0

現在,如果您嘗試將新的ID編號應用於具有重複ID值的顏色,該顏色具有不同答案的不同問題。我在下面的回答解決你最初想要返回的內容。 –

回答

1

這裏是實現這個使用窗口集合函數的一種方式:

CREATE VOLATILE TABLE MyTable, NO FALLBACK 
(MyID SMALLINT NOT NULL, 
MyColor VARCHAR(10) NOT NULL 
) 
PRIMARY INDEX (MyID) 
ON COMMIT PRESERVE ROWS; 

INSERT INTO MyTable VALUES (1, 'BLUE'); 
INSERT INTO MyTable VALUES (1, 'GREEN'); 
INSERT INTO MyTable VALUES (2, 'ORANGE'); 

SELECT * 
    FROM MyTable; 

SELECT MyID 
    , CASE WHEN MyCount = 1 
      THEN MyColor 
      ELSE 'MULTIPLE' 
     END AS MyNewColor 
    FROM (SELECT MyID 
      , MyColor 
      , ROW_NUMBER() OVER (PARTITION BY MyID 
            ORDER BY MyColor) AS MyRowNum 
      , COUNT(*) OVER (PARTITION BY MyID)  AS MyCount 
      FROM MyTable 
     ) DT1 
    WHERE MyRowNum = 1; 

結果:

MyID MyNewColor 
---- ---------- 
2  ORANGE 
1  MULTIPLE 
+0

謝謝羅布。我能夠使用你的建議來提出一個可行的解決方案。 – user2820576

+0

不客氣! –

4

試試這個:

SELECT id, 
CASE WHEN COUNT(color) > 1 THEN 'MULTIPLE' 
    ELSE MAX(color) 
END AS color 
FROM Table1 
GROUP BY id 

我SQLFIDDLE http://sqlfiddle.com/#!6/daf77/4測試,看上去做工精細

+0

我在嘗試,但它一直告訴我,「GROUP BY和WITH ... BY子句可能不包含集合函數。」 – user2820576

+0

這很奇怪,它是標準的SQL,但我沒有使用WITH BY。您可以在不同的關係數據庫中檢查小提琴的工作 –

+1

當然,這是有效的,這是獲得這種結果的標準方法。它必須是最後一個查詢中的其他內容,所以user2820576應該發佈它:-) – dnoeth