Sql 内部联接根据IF-THEN-ELSE语句从第二个表中仅选择一行
我有一张用户表。每个记录在付款表中都有一个或多个价格、日期和状态。我只想通过这个优先级来展示:Sql 内部联接根据IF-THEN-ELSE语句从第二个表中仅选择一行,sql,oracle,Sql,Oracle,我有一张用户表。每个记录在付款表中都有一个或多个价格、日期和状态。我只想通过这个优先级来展示: priority 1 => green (with older date) priority 2 => green (with new date) priority 3 => yellow (with older date if amount>1000) 用户表 ╔════╦══════════════╗ ║ id ║ name ║ ╠════╬════
priority 1 => green (with older date)
priority 2 => green (with new date)
priority 3 => yellow (with older date if amount>1000)
用户表
╔════╦══════════════╗
║ id ║ name ║
╠════╬══════════════║
║ 1 ║ Jeff_1 ║
║ 2 ║ Jeff_2 ║
║ 3 ║ Jeff_3 ║
╚════╩══════════════╝
付款表
╔═══════════════════════════════════╗
║ user_id state price date ║
╠═══════════════════════════════════╣
║ 1 green 5000 2019-10-14 ║
║ 1 green 3500 2019-10-11 ║
║ 1 yellow 1000 2019-10-09 ║
║ 2 yellow 50 2019-10-06 ║
║ 2 yellow 4000 2019-10-25 ║
║ 3 yellow 45900 2019-10-02 ║
║ 3 yellow 4000 2019-10-29 ║
╚═══════════════════════════════════╝
金额=>1000
我想要的是:
╔═══════════════════════════════════╗
║ user_id state price date ║
╠═══════════════════════════════════╣
║ 1 green 3500 2019-10-11 ║
║ 2 yellow 4000 2019-10-25 ║
║ 3 yellow 45900 2019-10-02 ║
╚═══════════════════════════════════╝
使用行编号()
:
这假设您只需要这三个优先级。也就是说,如果没有匹配的行,则不需要用户。使用以下脚本:
select u.user_id, payment.state, payment.price, payment.date
from users u
outer apply(select top 1 * from payments p
where p.user_id = u.user_id
and (p.state = 'green' or (p.state = 'yellow' and p.price > 1000))
order by p.date)payment
如果我正确理解了您的问题,您希望返回3个查询的结果,每个查询都获得具有给定优先级的记录,因此
(select ..., 1 as priority from ...
union all
select ..., 2 as priority from ...
union all
select ..., 3 as priority from ...)
order by priority
您需要使用以下分析函数
select t.*
from
(select t.*,
row_number()
over (partition by user_id
order by state, case when state= 'yellow' and price >1000 then 1 end desc, date) as rn
from payments t
where state = 'green' or
(state = 'yellow' and amount > 1000)
)t
where rn = 1;
干杯 这是MySQL或Oracle数据库的问题,因为它们是不同的产品(尽管两者都属于Oracle公司)。不要使用不相关的标记来回答您的问题。我删除了Mysql,因为您的一条评论说您使用Oracle。@MT0您是对的,我按预期更新了我的答案。仍然不确定它是否正确,因为无论优先级如何,
排序依据将给出日期最高的行。它应该按绿色、黄色、最低(不是最高)日期顺序订购。@MT0我首先检查绿色状态,以便给它更高的优先级,如果没有绿色,则检索带价格条件的黄色。否,您没有额外的数据行,对于id
1,您应该返回green
,但返回yellow
行。此外,MySQL或Oracle都不支持TOP
语法,MySQL也不支持OUTER APPLY
。如果您想要Oracle解决方案(对于Oracle 12c或更高版本,因为该版本支持OUTER APPLY
和仅获取第一行
),请从此点获取错误=>order by(state='green'))sql oracle developer中的desc=>从state='green'或(state='yellow'和delegation>1000)的states中选择delegation,state,row_number()(按sso分区,按顺序按(state='green')desc创建,在asc)作为tl@behzadomidi。我使用了MySQL语法,因为问题被标记为MySQL.answer in oracle=>选择state,date,row_number()over(state='green'时按用户分区,按大小写顺序,state='yellow'时按1,state='yellow'时按2,否则3 end,date asc)作为付款的tl,其中state='green'或(state='yellow'和delegation>1000)
select t.*
from
(select t.*,
row_number()
over (partition by user_id
order by state, case when state= 'yellow' and price >1000 then 1 end desc, date) as rn
from payments t
where state = 'green' or
(state = 'yellow' and amount > 1000)
)t
where rn = 1;