基于多种条件的选择

时间:2020-05-14 08:52:39

标签: sql oracle

我有一个根据渠道和组织选择客户的要求,即,客户的选择顺序应基于渠道-10、40、20、30,并且还需要选择该客户需要的所有组织。

例如,如果客户有一个频道10和40-则频道10的优先级高于40,依此类推。另外,对于每个客户,如果他们有2个组织,则都需要选择它们。

enter image description here

希望我很清楚。请有人帮我这个查询。

2 个答案:

答案 0 :(得分:2)

您可以使用Oracle的KEEP FIRST来应用优先顺序:

select
  min(channel) keep (dense_rank first order by 
    case channel when 10 then 1 when 40 then 2 when 20 then 3 else 4 end),
  customer,
  org
from mytable
group by customer, org
order by customer, org;

使用符合标准的ROW_NUMBER也可以实现同样的目的。

select channel, customer, org
from
(
  select
    t.*
    row_number() over (partition by customer, org
                       order by case channel when 10 then 1
                                             when 40 then 2
                                             when 20 then 3
                                             else 4 end) as rn,
  from mytable t
)
where rn = 1
order by customer, org;

如果想将其限制为某些客户,渠道或组织,请添加一个WHERE子句。

答案 1 :(得分:1)

很难定制的是订单。否则,这对WINDOW FUNCTIONS来说是简单的工作。

WITH CustomOrder AS (
    SELECT 10 as channel, 1 as ordr UNION ALL
    SELECT 40 as channel, 2 as ordr UNION ALL
    SELECT 20 as channel, 3 as ordr UNION ALL
    SELECT 30 as channel, 4 as ordr)
,TableWithOrder AS (
    SELECT c.Channel
        ,c.Customer
        ,c.Org
        ,co.ordr
    FROM Customers c 
    INNER JOIN CustomOrder co ON co.channel=c.channel
)
SELECT DISTINCT
    FIRST_VALUE(Channel) OVER (PARTITION BY customer,org ORDER BY ordr ROWS BETWEEN UNBOUNDED PRECEDEING AND UNBOUNDED FOLLOWING) as channel
    ,Customer
    ,Org
FROM TableWithOrder