选择顶部的行,直到特定列中的值出现两次
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择顶部的行,直到特定列中的值出现两次相关的知识,希望对你有一定的参考价值。
我有以下查询,我试图选择所有记录,并按日期排序,直到找到第二次EmailApproved = 1
。第二条记录,其中不应选择EmailApproved = 1
。
declare @Test table (id int, EmailApproved bit, Created datetime)
insert into @Test (id, EmailApproved, Created)
values
(1,0,'2011-03-07 03:58:58.423')
, (2,0,'2011-02-21 04:55:52.103')
, (3,0,'2011-01-29 13:24:02.103')
, (4,1,'2010-10-12 14:41:54.217')
, (5,0,'2010-10-12 14:34:15.903')
, (6,0,'2010-10-12 10:10:19.123')
, (7,1,'2010-08-27 12:07:16.073')
, (8,1,'2010-08-25 12:15:49.413')
, (9,0,'2010-08-25 12:14:51.970')
, (10,1,'2010-04-12 16:43:44.777')
select *
, case when Row1 = Row2 then 1 else 0 end Row1EqualRow2
from (
select id, EmailApproved, Created
, row_number() over (partition by EmailApproved order by Created desc) Row1
, row_number() over (order by Created desc) Row2
from @Test
) X
--where Row1 = Row2
order by Created desc
哪个会产生以下结果:
id EmailApproved Created Row1 Row2 Row1EqualsRow2
1 0 2011-03-07 03:58:58.423 1 1 1
2 0 2011-02-21 04:55:52.103 2 2 1
3 0 2011-01-29 13:24:02.103 3 3 1
4 1 2010-10-12 14:41:54.217 1 4 0
5 0 2010-10-12 14:34:15.903 4 5 0
6 0 2010-10-12 10:10:19.123 5 6 0
7 1 2010-08-27 12:07:16.073 2 7 0
8 1 2010-08-25 12:15:49.413 3 8 0
9 0 2010-08-25 12:14:51.970 6 9 0
10 1 2010-04-12 16:43:44.777 4 10 0
我真正想要的是:
id EmailApproved Created Row1 Row2 Row1EqualsRow2
1 0 2011-03-07 03:58:58.423 1 1 1
2 0 2011-02-21 04:55:52.103 2 2 1
3 0 2011-01-29 13:24:02.103 3 3 1
4 1 2010-10-12 14:41:54.217 1 4 0
5 0 2010-10-12 14:34:15.903 4 5 0
6 0 2010-10-12 10:10:19.123 5 6 0
注意:Row
,Row2
和Row1EqualsRow2
只是显示我的计算的工作列。
答案
; with test as
(
select *,
rn = row_number() over (order by Created desc),
approv_rn = row_number() over (partition by EmailApproved
order by Created desc)
from @Test
)
select *
from test t
cross apply
(
select x.rn
from test x
where EmailApproved = 1
and x.approv_rn = 2
) x
where t.rn < x.rn
order by Created desc
以上是关于选择顶部的行,直到特定列中的值出现两次的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值