我有一个有三列的表:id, sort, name在PostgreSQL 9.5数据库中。
我需要选择从sort=1开始到第一次中断之前的所有行(由sort命令)。
例如,我有:
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)有一个中断。所以我只需要休息前的行。
我该怎么做?
发布于 2016-02-17 16:50:08
这将适用于特殊情况:
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))发布于 2016-02-18 11:59:41
窗口函数可以在那里帮你。查找lead,它将按给定的顺序为您提供下一个值。有了他们,你就可以避免自我加入。
一个解决办法是:
-- 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;发布于 2016-02-18 14:06:39
假设sort是唯一的,只需查看窗口函数row_number()和sort之间的增量:
SELECT *
FROM (SELECT *, row_number() OVER (ORDER BY sort) AS grp FROM tbl) sub
WHERE sort = grp;sort在第一个间隙就失去了同步。
SQL Fiddle
详细说明:
https://dba.stackexchange.com/questions/129561
复制相似问题