当前位置: 首页 > 面试题库 >

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

华景同
2023-03-14
问题内容

我有以下查询,在这里我尝试选择所有记录(按日期排序),直到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只是用于显示我的计算的工作列。


问题答案:

脚步:

  1. rn如果id未按顺序在所有行上创建一个行号。
  2. 创建一个行号,按进行approv_rn分区,EmailApproved以便我们EmailApproved = 1第二次知道何时
  3. 使用outer apply来查找的second实例的行号EmailApproved = 1
  4. where子句中,筛选出所有行,其中行号是>=在步骤3中找到的值。
  5. 如果有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 = 1
                and     x.approv_rn     = 2
            ) x
    where   t.rn    < x.rn or x.rn is null
    order by t.Created desc
    


 类似资料:
  • 问题内容: 这是我的基本表(显示为关联数组): 在另一个名为的表上,我可以添加多个属于一行的自定义数据。像这样: 我目前正在制作,但它只会增加,并给我行。我想要的是我的查询返回如下内容: 行值变成一列,而,它就是值。 我该怎么做? 问题答案: SELECT a.ID, a.Campaign_ID, a.FirstName, a.LastName, MAX(CASE WHEN b.data = ‘q

  • 问题内容: 从pandas数据框中选择所有行的最简单方法是什么?谁的符号在整个表中恰好出现两次?例如,在下表中,我想选择在[‘b’,’e’]中带有sym的所有行,因为这些符号的value_counts等于2。 问题答案: 我认为您可以按列和值使用: 第二个解决方案使用与布尔索引: 并用最快的解决方案和:

  • 问题内容: 我有这样的桌子 我需要选择何时类型为0,何时类型为1,何时类型为N … 我怎样才能做到这一点? 问题答案:

  • 问题内容: 该主题的解决方案使我不知所措。 我有一个看起来像的表格(除与我的问题无关的其他字段之外): 名称,卡号,会员类型 现在,我想要一个显示卡号和成员类型相同的行的视图。这两个字段都是整数。名称为VARCHAR。名称不是唯一的,并且相同的名称也应显示重复的卡号,会员类型。 即,如果下表是表格: 我想要: 只需按卡号排序即可使其对人类有用。 最有效的方法是什么? 问题答案: 由于您提到的名称可

  • 问题内容: 我不知道该如何称呼这个问题。如果你有更好的话请指正我。 我有两个表,用户和帖子。 使用者: 帖子: 现在,我要列出“最活跃”的用户-写得最多的用户。具体来说,我想要结果。 我可以得到预期的结果。但是,如果某些用户拥有相同数量的帖子,则排名可能不会是“ 公平的 ”。 例如,我可能会得到如下结果: 在这里,实际上还有几个拥有帖子的用户。 因此,这可能不是确切的结果。如何获得包含帖子的额外用

  • 问题内容: 我一直在发疯,试图找出我在这里做错了什么愚蠢的事情。 我正在使用NumPy,并且我想从中选择特定的行索引和特定的列索引。这是我的问题的要点: 为什么会这样呢?我当然应该能够选择第一行,第二行和第四行以及第一列和第三列?我期望的结果是: 问题答案: 花式索引要求您提供每个维度的所有索引。您为第一个提供3个索引,为第二个仅提供2个索引,因此会出现错误。您想做这样的事情: 当然写这很痛苦,所