使用条件查找sql上的最后一行
我有一个具有两列ID和计数的表,如下所示:使用条件查找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 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哦,我忘了换那些了。谢谢