在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:此处没有聚合,这是一个窗口函数。请完全按照提供的方式运行查询。