选择值对照组中的最小值

时间:2013-09-27 07:32:28

标签: sql

这是我表格中的数据

XDATE       AC      BN      XPASS           UCODE   LVL
31-AUG-13   C-3     301     25-SEP-13       5465189  4
31-AUG-13   C-3     304     25-SEP-13       5465189  4
31-AUG-13   C-1     104     27-SEP-13       1000020  3
31-AUG-13   C-1     104     27-SEP-13       6461005  4

这是我正在执行的查询

select 
    AC,
    BN,
    (case when count(*)>1 then 'Forwarded' else 'Prepared' end) status,
    min(LVL) 
from adsalarypreparationdtl 
group by AC,BN 

这给了我以下结果:

AC       BN         STATUS         LVL
C-1      104        Forwarded       3
C-3      301        Prepared        4
C-3      304        Prepared        4

我发现了一切,但我也想根据LVL的最小值

来获得UCODE

就像这样:

AC       BN      STATUS     UCODE       LVL
C-1      104     Forwarded  1000020     3
C-3      301     Prepared   5465189     4
C-3      304     Prepared   5465189     4

请帮忙。

2 个答案:

答案 0 :(得分:2)

您没有说明您的DBMS,因此这是ANSI SQL:

select AC,
       BN,
       ucode, 
       lvl
from (
    select ac, 
           bn,
           ucode,
           lvl, 
           row_number() over (partition by AC,BN order by lvl) as rn
    from adsalarypreparationdtl 
) t 
where rn = 1;

答案 1 :(得分:1)

怎么样

select q1.*,q2.ucode
from (YourQuery) q1
left join adsalarypreparationdtl q2
on q1.ac=q2.ac and q1.bn=q2.bn and q1.minlvl=q2.lvl

在您的查询中,您应该将min(lvl)列别名为minlvl。

可能效率不高但可行。

编辑:如果有2行或更多行具有相同的lvl,您是否需要任何特殊处理?