首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在第一次休息前全部选择

在第一次休息前全部选择
EN

Database Administration用户
提问于 2016-02-17 16:40:45
回答 3查看 223关注 0票数 1

我有一个有三列的表:id, sort, name在PostgreSQL 9.5数据库中。

我需要选择从sort=1开始到第一次中断之前的所有行(由sort命令)。

例如,我有:

代码语言:javascript
运行
复制
id | sort | name
1  |   1  | 'ss'
2  |   2  | 'ss'
3  |   3  | 'ss'
4  |   4  | 'ss'
5  |   7  | 'ss'
6  |   8  | 'ss'

我想用id=1,2,3,4选择行。

如您所见,sort序列(4-7)有一个中断。所以我只需要休息前的行。

我该怎么做?

EN

回答 3

Database Administration用户

发布于 2016-02-17 16:50:08

这将适用于特殊情况:

代码语言:javascript
运行
复制
SELECT *
FROM your_table 
WHERE sort < (SELECT MIN(t.sort) 
              FROM your_table AS t
              LEFT JOIN your_table AS t2
                  ON t.sort = t2.sort+1 
              WHERE t2.sort IS NULL
                AND t.sort > (SELECT MIN(sort) FROM your_table))
票数 2
EN

Database Administration用户

发布于 2016-02-18 11:59:41

窗口函数可以在那里帮你。查找lead,它将按给定的顺序为您提供下一个值。有了他们,你就可以避免自我加入。

一个解决办法是:

代码语言:javascript
运行
复制
-- Getting the next value
with ahead as ( 
    select id, sort, lead(sort) over (order by sort) sort_lead, "name" 
    from test1
),
-- Find where we have the first gap
gap as (
    select min(sort) sort_limit from ahead
    where sort_lead - sort > 1
)
-- Select everything starting from 1 until the gap
select * from test1 
where sort between 1 and (select sort_limit from gap)
order by sort;
票数 1
EN

Database Administration用户

发布于 2016-02-18 14:06:39

假设sort是唯一的,只需查看窗口函数row_number()sort之间的增量:

代码语言:javascript
运行
复制
SELECT *
FROM  (SELECT *, row_number() OVER (ORDER BY sort) AS grp FROM tbl) sub
WHERE  sort = grp;

sort在第一个间隙就失去了同步。

SQL Fiddle

详细说明:

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/129561

复制
相关文章

相似问题

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