在sql中选择直到条件

在sql中选择直到条件,sql,sql-server,Sql,Sql Server,我有一张桌子 CREATE TABLE Table1( Id INT NOT NULL IDENTITY(1,1), EvType INT NOT NULL, CreatedByUserId INT NOT NULL ) 初始数据: 我只会得到满足下一个条件的行:我们选择行,直到该行的Id小于第一行,EvType==200 per createdByUserId。因此,我们需要为evType==200的每个用户首先选择所有第一行,我是这样做的: WITH EVS1 AS

我有一张桌子

CREATE TABLE Table1(
    Id INT NOT NULL IDENTITY(1,1),
    EvType INT NOT NULL,
    CreatedByUserId INT NOT NULL
)
初始数据:

我只会得到满足下一个条件的行:我们选择行,直到该行的Id小于第一行,EvType==200 per createdByUserId。因此,我们需要为evType==200的每个用户首先选择所有第一行,我是这样做的:

WITH EVS1 AS (
SELECT evs.Id, evs.EvType, evs.CreatedByUserId
ROW_NUMBER() OVER (PARTITION BY evs.CreatedByUserId ORDER BY evs.CreatedDate DESC) as rk
FROM [dbo].Table1 evs)

select *
From EVS1
WHERE EVS1.rk=1
这将产生以下结果:

然后不知何故,我需要为每个用户选择行,直到Id大于该用户的CTE中的行,这可能做到吗

因此,我们需要从该表中检索行,直到包含第4行。跳过第5行,因为它位于evType 200的第一个用户行之后

预期结果:

首先查找minid,然后查找id更低或相等的行

我相信,如果有索引,这个解决方案将比用于大数据的窗口函数更快

CREATE INDEX ix_evs1_evType_CreatedByUserId ON evs1(evType, CreatedByUserId) INCLUDE(id)
首先查找minid,然后查找id更低或相等的行

我相信,如果有索引,这个解决方案将比用于大数据的窗口函数更快

CREATE INDEX ix_evs1_evType_CreatedByUserId ON evs1(evType, CreatedByUserId) INCLUDE(id)

您可以执行窗口最大值:

select Id, EvType, CreatedByUserId
from (
    select 
        t.*,
        max(case when EvType = 200 then 1 else 0 end) 
            over(partition by CreatedByUserId order by Id) flagEvType
    from [dbo].Table1
)
where flagEvType = 0

您可以执行窗口最大值:

select Id, EvType, CreatedByUserId
from (
    select 
        t.*,
        max(case when EvType = 200 then 1 else 0 end) 
            over(partition by CreatedByUserId order by Id) flagEvType
    from [dbo].Table1
)
where flagEvType = 0

您希望选择由用户创建的所有行,但事件类型为200的行除外:

select *
from mytable t1
where not exists
(
  select null
  from mytable t2
  where t2.evtype = 200
  and t2.createdbyuserid = t1.createdbyuserid
  and t2.id < t1.id
);

您希望选择由用户创建的所有行,但事件类型为200的行除外:

select *
from mytable t1
where not exists
(
  select null
  from mytable t2
  where t2.evtype = 200
  and t2.createdbyuserid = t1.createdbyuserid
  and t2.id < t1.id
);

同意,对于这样的事情,不需要CTEthis@RadimBač倒数第二个查询的结果给出了这个结果。聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且被聚合的列是外部引用。但它是子查询!你不知怎么重写了我的查询吗?@ircoder同意,不需要CTEthis@RadimBač倒数第二个查询的结果为我提供了这一个聚合可能不会出现在WHERE子句中,除非它出现在HAVING子句或select列表中包含的子查询中,被聚合的列是一个外部引用,但它是一个子查询!您是否以某种方式重写了我的查询?@IRCodder聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且正在聚合的列是外部查询reference@IRCodder:此处没有聚合,这是一个窗口函数。请完全按照提供的方式运行查询。聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或select列表中包含的子查询中,并且要聚合的列是外部查询reference@IRCodder:此处没有聚合,这是一个窗口函数。请完全按照提供的方式运行查询。