Oracle / SQL - 返回半唯一记录

时间:2011-09-21 19:53:13

标签: sql oracle unique distinct

我要做的是通过表格并根据某个字段返回半独特的结果。例如,使用此数据

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

希望这是有道理的。此外,这将针对Oracle运行,因此无论采用哪种最有效的方式都可以做到这一点(源表将包含10 mil记录和30个不同的段)

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

我知道当您只想返回段列时,此技术有效。

    SELECT DISTINCT segment
    FROM YOUR_TABLE_NAME

但是,当你尝试查询时:

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

对于每个具有不同信息的细分,这将返回多行。

此问题似乎与here发现的问题类似。

如果我没有正确理解你的问题,请发表评论=)

答案 2 :(得分:0)

如果您不想键入所有字段名称:

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

我不知道在oracle中究竟是如何调用tuple-id / rownumber / object-id的,但我确定它存在。