2011-09-21 50 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