2011-09-21 49 views
2

什麼,我試圖做的是經過一個表並返回基於某一個領域半唯一結果。因此,例如,與此數據的Oracle/SQL - 回到半唯一記錄

field1 segment  field2 field3 field4 etc 
----------------------------------------------- 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S4   xxx  xxx  xxx  xxx 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S2   xxx  xxx  xxx  xxx 
xxxx S2   xxx  xxx  xxx  xxx 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S3   xxx  xxx  xxx  xxx 

我想要做的就是回到1個記錄每段類型是什麼。其他數據應來自所選記錄,但只要我爲每個段類型獲得1個唯一記錄,哪條記錄就無關緊要。

field1 segment  field2 field3 field4 etc 
----------------------------------------------- 
xxxx S1   xxx  xxx  xxx  xxx 
xxxx S4   xxx  xxx  xxx  xxx 
xxxx S2   xxx  xxx  xxx  xxx 
xxxx S3   xxx  xxx  xxx  xxx 

希望這是有道理的。同時這將運行對甲骨文等等諸如此類的最有效的方式做到這將是巨大的(源表會碰到這樣的10萬條記錄和30個不同的段)

回答

2

你可以做類似

SELECT segment, 
     field1, 
     field2, 
     field3, 
     field4 
    FROM (SELECT segment, 
       field1, 
       field2, 
       field3, 
       field4, 
       row_number() over (partition by segment order by rownum) rnk 
      FROM table_name) 
WHERE rnk = 1 

這將爲每個SEGMENT選擇一個任意的行。如果將來有人確定他們確實關心挑選哪一行,則可以在分析功能中調整ORDER BY。

0

我知道這個技術的原理,當你只想例如返回段列。

SELECT DISTINCT segment 
    FROM YOUR_TABLE_NAME 

但是,當你嘗試和查詢像這樣:

SELECT DISTINCT SEGMENT, FIELD2, FIELD3 
    FROM YOUR_TABLE_NAME 
    WHERE BLAH = BLAH 

這將返回多行,並與它不同的信息每個段。

這個問題似乎有點類似問題發現here

請評論,如果我沒有正確理解你的問題=)

0

如果你不想鍵入所有的字段名稱:

SELECT * 
FROM table_name t0 WHERE NOT EXISTS (
    SELECT * FROM table_name t1 
    WHERE t1.segment = t0.segment 
    AND t1.ROWNUM < t0.ROWNUM 
    ; 

我不知道究竟如何完全元組-id/rownumber/object-id在oracle中調用,但我確定它存在。

+0

這是可以做到的,但我想通常你必須從t中選擇t。*,rownum作爲RN作爲子查詢。 – FrustratedWithFormsDesigner