Oracle 从四个字段(列)中的两个字段中选择顶部(最大)金额

Oracle 从四个字段(列)中的两个字段中选择顶部(最大)金额,oracle,Oracle,我有这个疑问 SELECT code, username, week1money, week2money, week3money, week4money FROM( --subquery goes here ) 如何选择前两周,即具有最高值的周?我想准确地总结前两周的情况。回答我的问题 select * from( select * from( select week1money col from dual union select week2money col f

我有这个疑问

SELECT code, username, week1money, week2money, week3money, week4money FROM(
--subquery goes here
)

如何选择前两周,即具有最高值的周?我想准确地总结前两周的情况。

回答我的问题

select * from(
  select * from(
    select week1money col from dual
    union
    select week2money col from dual
    union
    select week3money col from dual
    union
    select week4money col from dual
  ) order by col desc
) where rownum < 3 

使用GREATESTS也可能有帮助。

如果我理解正确,您希望每个代码都有两个顶级值,用户名行和代码,用户名是记录集的键。 假设您可以有两个具有相同值的前两周,并且没有空值,这可能是解决方案之一:

SQL> with t (id, code, week1, week2, week3, week4)
  2  as (
  3  select 1, 'a', 10, 15, 11, 8 from dual union all
  4  select 2, 'b', 7, 4, 2, 9 from dual union all
  5  select 3, 'c', 3, 3, 1, 0 from dual
  6  )
  7  select id, code, max(week) first_top, min(week) next_top from (
  8  select id, code, row_number() over(partition by id, code order by week desc) rnk, week
  9  from (
 10  select t.id, t.code,
 11  decode(r.rn,1,week1,2,week2,3,week3,4,week4) week
 12  from t,
 13  (select rownum rn from dual connect by level <= 4) r
 14  ))
 15  where rnk in (1,2)
 16  group by id, code
 17  /

        ID C  FIRST_TOP   NEXT_TOP                                              
---------- - ---------- ----------                                              
         3 c          3          3                                              
         1 a         15         11                                              
         2 b          9          7   
如果您在几周内有非空值和不同的值,您可以使用以下内容:

SQL> with t (id, code, week1, week2, week3, week4)
  2  as (
  3  select 1, 'a', 10, 15, 11, 8 from dual union all
  4  select 2, 'b', 7, 4, 2, 9 from dual union all
  5  select 3, 'c', 3, 2, 1, 0 from dual
  6  )
  7  select id, code
  8  , greatest(week1, week2, week3, week4) first_top
  9  , greatest(
 10  case when week1 < greatest(week1, week2, week3, week4) then week1 else -1e28 end,
 11  case when week2 < greatest(week1, week2, week3, week4) then week2 else -1e28 end,
 12  case when week3 < greatest(week1, week2, week3, week4) then week3 else -1e28 end,
 13  case when week4 < greatest(week1, week2, week3, week4) then week4 else -1e28 end
 14  ) second_top
 15  from t
 16  /

        ID C  FIRST_TOP SECOND_TOP                                              
---------- - ---------- ----------                                              
         1 a         15         11                                              
         2 b          9          7                                              
         3 c          3          2 
但要获得正确的解决方案,需要更多的细节