我有一个表可能有重复记录,除了一个字段,即下表中的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
如果有有效的方法可以帮助我。
答案 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或更小。 请告诉我这是否正确
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)
这是根据Col3
和Col2
获得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
中找到解决方案