繁体   English   中英

Oracle-sql:按层分组查询

[英]Oracle-sql : Query with hiererchical group by

我有一张像这样的桌子:

   ID || Ent NAME  ||  FUNCTION
   1  || Dupuis    ||  Signatory
   1  || Daturt    ||  Decision Maker
   1  || Nobel     ||  (Null )
   2  || Karl      ||  Decision Maker
   2  || Titi      ||  (Null )
   3  || Cloves    ||  (Null )
   3  || Cardigan  ||  (Null )

我想在预先建立的层次结构中(Signatory > Decision Maker > (Null ) )得到最“重要”的人,所以预期结果是:

   ID Ent || NAME      || FUNCTION
       1  ||  Dupuis   || Signatory
       2  ||  Karl     || Decision Maker
       3  ||  Cardigan || (Null )

第三天,我不在乎被选中的人。

我在Oracle中工作的权限非常有限,我可以执行SELECT ( and this it is s*** ).

我有一个绕过解决方案的方法,但这非常丑陋,我不满意:

(SELECT "ID Ent" max (NOM), max (FUNCTION) 
    FROM table 
    WHERE FUNCTION = 'Signatory' GROUP BY "ID Ent") 
UNION 
(SELECT "ID Ent" max (NOM), max (FUNCTION) 
    FROM table 
    WHERE FUNCTION = 'Decision Maker' 
        AND "ID Ent" not in (SELECT "ID Ent" FROM table WHERE FUNCTION = 'Signatory') 
    GROUP BY "ID Ent") 
UNION 
(SELECT "ID Ent" max (NOM), max (FUNCTION) 
    FROM table 
    WHERE FUNCTION = 'Decision Maker' 
        AND "ID Ent" not in (SELECT "ID Ent" in FUNCTION FROM table WHERE ('Signatory', 'Decision Maker')) 
    GROUP BY "ID Ent");

您有更好的方法吗?

我将使用解析函数来解决这个问题:

select t.Id, t.Name, t.Function
from (select t.*,
             row_number() over (partition by id
                                order by (case when function = 'Signatory' then 1
                                               when function = 'Decision Maker' then 2
                                               else 3
                                          end)
                               ) as seqnum
      from table t
     ) t
where seqnum = 1;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM