【问题标题】:Oracle/SQL - Returning semi-unique recordsOracle/SQL - 返回半唯一记录
【发布时间】:2011-09-21 19:53:13
【问题描述】:

我要做的是遍历一个表并根据某个字段返回半唯一的结果。所以以这个数据为例

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 运行,因此无论哪种最有效的方法都会很好(源表将有 1000 万条记录和 30 个不同的段)

【问题讨论】:

    标签: sql oracle unique distinct


    【解决方案1】:

    你可以这样做

    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。

    【讨论】:

      【解决方案2】:

      我知道这种技术在您只想返回段列时有效。

          SELECT DISTINCT segment
          FROM YOUR_TABLE_NAME
      

      但是,当您尝试这样查询时:

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

      这将为每个分段返回多行,其中包含不同的信息。

      这个问题似乎有点类似于here 发现的问题。

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

      【讨论】:

        【解决方案3】:

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

         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,但我确定它存在。

        【讨论】:

        • 这可以做到,但我认为通常你必须将select t.*, rownum as RN from t 作为子查询。
        猜你喜欢
        • 1970-01-01
        • 2019-06-29
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多