使用条件查找sql上的最后一行

使用条件查找sql上的最后一行,sql,Sql,我有一个具有两列ID和计数的表,如下所示: ID Count 1 1 2 1 3 2 4 3 5 1 6 2 7 1 8 1 9 1 10 2 ID EndID 1 1 2 4 5 6 7 7 8 8 9 10 我需要的结果如下: ID Count 1 1 2 1 3 2 4 3 5 1 6 2 7 1 8 1 9 1 10

我有一个具有两列ID和计数的表,如下所示:

ID   Count
1    1
2    1
3    2
4    3
5    1
6    2
7    1
8    1
9    1
10   2
ID   EndID
1    1 
2    4
5    6
7    7
8    8 
9    10
我需要的结果如下:

ID   Count
1    1
2    1
3    2
4    3
5    1
6    2
7    1
8    1
9    1
10   2
ID   EndID
1    1 
2    4
5    6
7    7
8    8 
9    10

结果背后的逻辑是:StartID有count 1,EndID是next count=1之前的行的Id。在下一次计数1之前,这里ID 1以1开始和结束,ID 2以ID 4开始和结束。类似地,它继续下去

对于您问题中的数据,这是有效的:

select t.id,
       (select min(t2.id) - 1
        from t t2
        where t2.id > t.id and t2.count = 1
       ) as EndId
from t
where t.count = 1;
这确实假设ID中没有间隙。

我们不知道您使用的RDBMS,因此这是标准版本:

SELECT id, COALESCE((SELECT MAX(ID) FROM tableName 
                     WHERE id < (SELECT MIN(id) FROM tableName t2 
                             WHERE t2.id > t1.id AND t2.c = 1 )), 
                    (SELECT MAX(id) FROM tableName)) AS endid
FROM tableName t1 WHERE c = 1
结果是:

1   1
2   4
5   6
7   7
8   8
9   NULL

这就是为什么你需要最后的合并部分。其思想是选择大于外部查询ID的最小ID,然后根据该ID找到小于最小ID的最大ID。这样,即使ID中包含间隙,也可以使用它。

不要将关键字用于列名。在下面的查询中,我使用cnt而不是count。你必须建立你能找到起点和终点的小组。如果ID连续且没有间隙,则使用:

select min(id) as startid, max(id) as endid
from
(
  select id, cnt, id - cnt as groupkey
  from mytable
) grouped
group by groupkey
order by min(id);
其他用途:

select min(id) as startid, max(id) as endid
from
(
  select id, cnt, row_number() over (order by id) - cnt as groupkey
  from mytable
) grouped
group by groupkey
order by min(id);

当然,前提是您的DBMS具有行数功能。行号是标准的SQL,所以很多数据库管理系统都有它。

我没有否决,但你有t2.id>t.id和t2.id>t.id,我想应该是t2.id>t.id和t2.count=1。仍然找不到ID 9的结束ID 10。@ThorstenKettner。非常感谢你;你的评论很有帮助。我希望堆栈交换不鼓励匿名向下投票。挑剔:这不是标准的SQL,因为@t在标准中是无效的标识符SQL@a_horse_with_no_name哦,我忘了换那些了。谢谢