我有一个根据渠道和组织选择客户的要求,即,客户的选择顺序应基于渠道-10、40、20、30,并且还需要选择该客户需要的所有组织。
例如,如果客户有一个频道10和40-则频道10的优先级高于40,依此类推。另外,对于每个客户,如果他们有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