簡體   English   中英

具有聚合和獨特的SQL查詢

[英]Sql query with aggregate and distinct

查詢的目的:雇員有幾個職位,每個職位都列在數據庫中。 但是,查詢應僅返回每個職位級別具有最新effect_date的職位。

例如:

Employee  Position Position_Level Effect_Date Process_Level
_____________________________________________________________

1        ,  POS1   ,   1     ,       01/01/2000   ,ABC

1        ,  POS1   ,   1     ,       01/01/2002  , ABC

1       ,   POS1   ,   1     ,       01/01/2003  , ABC

1     ,     ABCD   ,   1        ,    01/01/2004 ,  ABC

1       ,   POS1   ,   1        ,    01/01/2005  , ABC

1       ,   POS2  ,   2        ,    01/01/2000 , DEF

1      ,    POS2   ,   2       ,     01/01/2002  , DEF

1    ,      IRHT  ,    2       ,     01/01/2003 ,  DEF

1     ,     POS2   ,   2       ,     01/01/2004 ,  DEF

查詢應返回:

Employee  Position Position_Level Effect_Date Process_Level

1     ,     POS1  ,    1     ,       01/01/2005  , ABC

1      ,    POS2    ,  2     ,       01/01/2004 ,  DEF

是否可以在一個查詢中實現? 由於我只需要不超過Position_Level = 3的記錄,因此我也可以執行3個單獨的查詢,但是我很難為每個位置級別獲取1個不同的記錄。

我有這個查詢,我以此為起點,但是顯然沒有得到我需要的結果。 有什么建議么?

select A.*, B.pos_level,B.employee from (select position,max(effect_date)EFFECT_DATE
from paemppos
group by position) A
JOIN paemppos B 
on A.POSITION=B.POSITION

通常,最有效的方法是使用適當的索引not exists

select p.*
from paemppos p
where not exists (select 1
                  from paemppos p2
                  where p2.employee = p.employee and
                        p2.position = p.position and
                        p2.effect_date > p.effect_date
                 );

最好的索引是在paemppos(employee, position, effect_date)

該查詢的意思是:“從paemppos中獲取所有行,其中該行上的雇員/職位在數據中沒有更大的effect_date 。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM