回答

收藏

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

技术问答 技术问答 120 人阅读 | 0 人回复 | 2023-09-13

我有以下查询,在这里我试着选择所有的记录(按日期排序),直到EmailApproved = 1直到找到第二次。第二条记录EmailApproved =不要在哪里选择。( W1 D$ _1 ]! n3 o* P' X+ ?
declare @Test table (id int,EmailApproved bit,Created datetime)insert into @Test (id,EmailApproved,Created)values -03-07 03:58:58. ,-02-21 04:55:52. ,-01-29 13:24:02. ,-10-12 14:41:54.217) ,-10-12 14:34:15. ,(6,0,2010-10-12 10:10:19.123) ,-08-27 12:07:16. ,-08-25 12:15:49. ,-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 Row1EqualRow2from (  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 = Row2order by Created desc产生以下结果:
) H2 ]* w: Y6 [8 _7 b% g0 kid  EmailApproved   Created                 Row1    Row2    Row1EqualsRow211111111111                             -03-07 03:58:58.423 1           12                      2011111111                       -02-21 04:55:52.103 2                                    201111111111111       -01-29 13:24:02.1033 3    3   3       14 14                 20101010101010                  -10-12 14:41:54.                                      201010101010                -10-12 14:34:15.                              -10-12 10:10:19.1235                                     20101010101010                   -08-27 12:07:16.                                        2010101010101010      -08-25 12:15:49.4133 3     8                              20101010101010          -08-25 12:14:51.                                    20101010年    -04-12 16:43:44.7774       10      我真正想要的是:
1 \' m! R( w6 R5 sid  EmailApproved   Created                 Row1    Row2    Row1EqualsRow211111111111                             -03-07 03:58:58.423 1           12                      2011111111                       -02-21 04:55:52.103 2       2       13   0               2011-01-29 13:24:02.1033 3    3   3       14 14                 20101010101010                  -10-12 14:41:54.                                      201010101010                -10-12 14:34:15.                              -10-12 10:10:19.123 5     6    注意:Row,Row2&Row1EqualsRow工作列只用于显示我的计算。
* m* R/ T3 D- M2 m) u                                                                3 v' A4 c& A' B! |2 U% _! _3 s
    解决方案:                                                                & g( |+ q5 ~( _3 C7 N' K6 S2 \
                                                                脚步:. j' A% R5 J) ]7 I- H5 o4 v
[ol]rn如果id未按顺序在所有行上创建行号。( y6 o3 a% M2 S7 H3 E4 Z
创建行号,行号approv_rn分区,EmailApproved以便我们EmailApproved = 1第二次知道什么时候, K5 w5 \1 N+ r& l% g
使用outer apply来查找的second实例的行号EmailApproved = 1* k+ a( H5 n5 G
在where在句子中,筛选出所有行,其中行号为>=在步骤3中找到的值。  r9 }) E9 E; Z9 `+ [3 o
如果有1或0EmailApproved条记录可用,则outer apply将会返回null,在这种情况下,将返回所有可用行。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        outer apply    select  x.rn            from    test x            where   x.EmailApproved =            and     x.approv_rn     = 2        ) xwhere   t.rn    [/ol]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则