Radio_ID | Log_ID
-----------------
1 | 1
1 | 2
1 | 4
1 | 7
1 | 10
2 | 1
2 | 2
2 | 3
2 | 5
是否可以在单个sql语句中获得以下输出?
输出:
Radio_ID | Log_ID
-----------------
1 | 3
1 | 5
1 | 6
1 | 8
1 | 9
2 | 4
逻辑:返回每个id的缺失值< id的最大值(ex 10是radio id 1的最大值,缺失值是3,5,6,8,9)。
我有一个无线电设备的数据解析器,当无线电在覆盖范围之外时,它不发送数据,所以我必须发送一个丢失Log_ID
的新请求。
谢谢!
答案 0 :(得分:3)
我假设您有一个名为numbers
的表,其中包含足够范围的整数。
然后你可以这样做:
select r.radio_id, n.n as MissingLogId
from (select radio_id, min(log_id) as minli, max(log_id) as maxli
from table t
group by radio_id
) r join
numbers n
on n.n between r.minli and r.maxli left join
table t
on t.radio_id = r.radio_id and t.log_id = n.n
where t.radio_id is null;
我们的想法是使用join
为每个无线电ID(最小和最大ID之间)生成所有数字。然后过滤掉现有值。
如果你没有方便的数字表,你需要创建一个足够大的表。这可能会奏效:
create table numbers (n int primary key);
insert into numbers(n)
select (@rn := @rn + 1) as n
from table cross join (@rn := 0);