首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择直到sql中的条件

选择直到sql中的条件
EN

Stack Overflow用户
提问于 2019-12-12 10:17:08
回答 3查看 688关注 0票数 0

我有张桌子

代码语言:javascript
复制
CREATE TABLE Table1(
    Id INT NOT NULL IDENTITY(1,1),
    EvType INT NOT NULL,
    CreatedByUserId INT NOT NULL
)

初步数据:

我只会得到符合下一个条件的行:我们选择行,直到该行的Id小于第一行为止,每个createdByUserId都有== 200。因此,我们需要使用evType == 200为每个用户直接选择所有的第一行,我已经这样做了:

代码语言:javascript
复制
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

预期结果:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-12 10:19:58

首先查找min(id),然后查找具有较低或相等id的行

代码语言:javascript
复制
SELECT *
FROM EVS1
WHERE id <= (SELECT MIN(id) FROM EVS1 WHERE evType = 200)

我假设您根据id属性定义排序。

如果有必要对每个CreatedByUserId执行此操作,则使用依赖子查询进行最小id计算。

代码语言:javascript
复制
SELECT *
FROM EVS1 e1
WHERE id <= (
  SELECT MIN(id) 
  FROM EVS1 e2
  WHERE e2.evType = 200 
    and e1.CreatedByUserId = e2.CreatedByUserId
)

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

代码语言:javascript
复制
CREATE INDEX ix_evs1_evType_CreatedByUserId ON evs1(evType, CreatedByUserId) INCLUDE(id)
票数 2
EN

Stack Overflow用户

发布于 2019-12-12 10:22:43

您可以最大限度地创建一个窗口:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-12-12 10:58:56

您希望选择用户创建的所有行,但在事件类型200之前发生的行除外:

代码语言:javascript
复制
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
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59302285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档