Select语句ORACLE-SQL上的不同记录

时间:2015-07-17 04:15:57

标签: sql oracle select

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

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

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

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

如果有有效的方法可以帮助我。

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您可以使用分析函数将排名编号指定为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应用某种转换。

答案 2 :(得分:0)

试试这个

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

如果您尝试通过选择多列来使用一列中的不同,则应使用Max()Min()来获取值

您将在此处找到的问题是

col1  col2    col3
aa     T      qqq 
aa     F      zzz 

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

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

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

希望有所帮助

答案 3 :(得分:0)

在此查询中,如果为“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 :(得分:0)

这是根据Col3Col2获得Col1值的另一个值,无论列中的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

在小提琴http://sqlfiddle.com/#!6/77d2b/2

中找到解决方案