【问题标题】:Distinct records on Select statement ORACLE-SQL选择语句 ORACLE-SQL 上的不同记录
【发布时间】:2015-07-17 04:15:56
【问题描述】:

我有一个可能重复记录的表,除了一个字段,即下表中的 Field2。 Field1 是加入 Table 的 Key。

Field1  Field2  Field3
  aa      T       qqq
  aa      F       qqq
  bb      F       eee
  cc      T       rrr

现在在 Field2 中,如果 T 和 F 都存在于同一个 Field1 中,我想选择具有 T 作为字段 2 值的行。 如果只有 T 或 F 可用,我想要该记录。 所以 Select 语句的输出应该是

Field1  Field2  Field3
  aa      T      qqq
  bb      F      eee
  cc      T      rrr

如果有有效的方法,请帮助我。

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    根据您的要求,我会使用:

    select 
       Field1,  
       max(Field2) as Field2,
       max(Field3) keep(dense_rank first order by Field2 desc) as Field3
    from 
       table
    group by 
       Field1;
    

    第三列函数获取Field2对应的行。

    【讨论】:

    • 我不知道 keep (dense_rank first ..) 有什么作用,但可以。明天有东西要读
    【解决方案2】:

    您可以使用分析函数将排名数字分配给Field2 的值。

    select Field1,  Field2,  Field3 from (
        select Field1
                ,  Field2
                ,  Field3 
                , row_number() over (partition by Field1,  Field3 
                                     order by Field2 desc) rn
        from your_table
        )  
    where rn = 1
    /
    

    此实现假定反向字母排序将根据您的需要产生正确的顺序。如果您有更复杂的优先级方案,则需要使用 CASE 或 DECODE 应用某种转换。

    【讨论】:

    • 我做了复杂的 CASE 部分,但是检查你的代码不知道我是否可以让我的更简单?
    【解决方案3】:

    在此查询中,如果是 'T',则分配 0

    这样,如果有一个“T”,总是首先出现。

    我所做的唯一假设是每个 Col1 的“T”和“F”出现 1 或更少。 请告诉我这是否正确

    SQL FIDDLE DEMO

    with cteEmp as (
        SELECT 
          Col1, Col2, Col3,
          ROW_NUMBER()
            OVER (PARTITION BY Col1 ORDER BY CASE 
                                                WHEN Col2='T' THEN 0 
                                                ELSE 1 
                                             END ) AS row_id    
        FROM Employee
    )
    SELECT E.* 
    FROM Employee E INNER JOIN 
         cteEmp CE ON (E.Col1 = CE.Col1 AND 
                       E.Col2 = CE.Col2 AND
                       CE.row_id=1)
    

    【讨论】:

      【解决方案4】:

      试试这个

      select col1,MAX(col2) as Col2,Max(Col3) as Col3 from Employee group by Col1
      

      如果您尝试通过选择多列来在一列中使用 distinct,您应该使用 Max()Min() 来获取值

      你会发现这里的问题是

      col1  col2    col3
      aa     T      qqq 
      aa     F      zzz 
      

      在这种情况下,MAX(col3) 将是 zzz 而不是 qqq

      在这种情况下,您必须根据自己的要求在 Max()Min() 之间进行选择。

      在小提琴中找到您的解决方案 http://sqlfiddle.com/#!6/257ff/3

      希望有帮助

      【讨论】:

      • 我喜欢你的回答,但不确定我们是否可以假设 Field3 与单个 Field1 的值相同。
      • @JuanCarlosOropeza:对不起,我没有明白你的意思。请你编辑我的 SQL 小提琴或分享一个新的,以便我检查。
      • @Saurabh:很高兴我来寻求您的帮助 :)
      • 我看到的问题是 aa T qqqaa F zzz 在这种情况下 MAX(Field3) 将是 zzz 而不是 qqq。但看起来 OP 没问题。
      • 由于group by,您的查询中不需要区分
      【解决方案5】:

      这是另一个根据Col2Col1 获取Col3 值的方法,而与列中的Max()Min() 无关

      select col1, MAX(col2) as Col2 , 
      (select top 1 col3 from Employee as E where E.Col1=Employee.Col1 and 
      E.col2 = max(Employee.Col2) order by col3) as Col3 
      from Employee 
      group
      by Col1
      

      在 Fiddle http://sqlfiddle.com/#!6/77d2b/2 中找到解决方案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 2014-01-21
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        相关资源
        最近更新 更多