如何解决SQL Window 函数使用 Case
我正在尝试返回 ID 和状态可以相同的记录,只要支付日期不同。如果一个 ID 有多个状态,那么它只需要返回一个订单优先级为已批准、已拒绝、待处理、第一通知的记录。但是,如果一个 ID 具有多个不同日期的已批准状态,则需要返回两条记录。
select *,row_number()over(partition by id,paid_date order by
CASE when status ='Approved' then 1
when status = 'Denied' then 2
when status = 'Pending' then 3
when status = 'First Notice then 4 end
) as rownum
from @t
最终输出应该是这样的:
ID Paid_Date Status
1 2020-01-01 Approved
1 2020-02-01 Approved
2 2020-02-03 Approved
3 2020-02-04 Denied
4 2020-02-04 Denied
5 2020-02-05 Approved
以下是一些示例数据:
declare @t table(id int,paid_date date,status varchar(25))
insert into @t
values(1,'2020-01-01','Approved'),(1,'2020-02-01',NULL,'First Notice'),(2,'2020-02-03',(3,'Pending'),'2020-02-04','Denied'),(4,(5,'2020-02-05','Approved')
select * from @t
对此的任何帮助将不胜感激。我觉得我已经接近但无法走到尽头。
解决方法
添加第二个 row_number
以检测多个已批准但不同的日期案例,例如
with cte as (
select id,paid_date,[status],row_number() over (partition by id order by
case when status ='Approved' then 1
when status = 'Denied' then 2
when status = 'Pending' then 3
when status = 'First Notice' then 4 end asc
) as rownum1,case when [status] = 'Approved' then row_number() over (partition by id,paid_date order by paid_date) else null end as rownum2
from @t
where paid_date is not null
)
select id,[status]
from cte
where rownum1 = 1 /* Highest priority as defined */ or rownum2 = 1 /* Or approved but different date */
order by id,[status];
返回:
id | paid_date | 状态 |
---|---|---|
1 | 2020-01-01 | 批准 |
1 | 2020-02-01 | 批准 |
2 | 2020-02-03 | 批准 |
3 | 2020-02-04 | 拒绝 |
4 | 2020-02-04 | 拒绝 |
5 | 2020-02-05 | 批准 |
嗯。 . .我认为你的逻辑基本上是正确的,有两个调整:
- 从
partition by
中删除日期。 - 明确选择所有“已批准”。
所以:
select t.*
from (select t.*,row_number() over (partition by id
order by (case when status ='Approved' then 1
when status = 'Denied' then 2
when status = 'Pending' then 3
when status = 'First Notice' then
end)
from @t t
) t
where seqnum = 1 or status = 'Approved';
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。