选择顶部的行,直到特定列中的值出现两次

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

注意:RowRow2Row1EqualsRow2只是显示我的计算的工作列。

答案
; 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:如何根据另一列中的匹配值从数组中的第一次出现中选择直到最后的值

Pandas:仅当特定列中的值以开头时才选择数据框行

SQL 聚合具有相同 id 的行,辅助列中的特定值

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

如何选择在两列中具有相同值集的行,从而连接第三列中的值?

熊猫选择列中的值不以字符串开头的行