我有张桌子
CREATE TABLE Table1(
Id INT NOT NULL IDENTITY(1,1),
EvType INT NOT NULL,
CreatedByUserId INT NOT NULL
)初步数据:

我只会得到符合下一个条件的行:我们选择行,直到该行的Id小于第一行为止,每个createdByUserId都有== 200。因此,我们需要使用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
预期结果:

发布于 2019-12-12 10:19:58
首先查找min(id),然后查找具有较低或相等id的行
SELECT *
FROM EVS1
WHERE id <= (SELECT MIN(id) FROM EVS1 WHERE evType = 200)我假设您根据id属性定义排序。
如果有必要对每个CreatedByUserId执行此操作,则使用依赖子查询进行最小id计算。
SELECT *
FROM EVS1 e1
WHERE id <= (
SELECT MIN(id)
FROM EVS1 e2
WHERE e2.evType = 200
and e1.CreatedByUserId = e2.CreatedByUserId
)我相信,如果您有一个索引,这个解决方案将比用于大型数据的窗口函数更快。
CREATE INDEX ix_evs1_evType_CreatedByUserId ON evs1(evType, CreatedByUserId) INCLUDE(id)发布于 2019-12-12 10:22:43
您可以最大限度地创建一个窗口:
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发布于 2019-12-12 10:58:56
您希望选择用户创建的所有行,但在事件类型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
);https://stackoverflow.com/questions/59302285
复制相似问题