Hello在我的2008 SQL Server中,我有一个sitting
列,其中包含int
个值,如下所示
0,1,2,4,5
我想要3
1,2,3,5,6,7,8
我想要0
0,1,2,3,6,7,8
我想要4
0,1,2,3,4,5,6,7,8
我想要9
我在这里想要实现的是在给定数字之间找到gap
。我尝试使用适合我的代码,但我认为它是非常硬编码的,所以我想知道是否有任何更简单的方法来实现这一点,例如SQL query
?
该列必须始终以0
开头,因此如果未找到任何结果,我需要先放置0
。
如果没有间隙,我需要继续并添加最大值+1。
object resultSeat = "";
string querySeat = "SELECT ID_K FROM klient WHERE sitting=@sitting AND (event=@event";
for (int a = 0; a < ConnectedEvents.Count(); a++)
{
querySeat += " OR event='" + ConnectedEvents[a] + "'";
}
querySeat += ")";
for (int i = 0; i <= resultKlimax; i++)
{
SqlCommand comQuerySeat = new SqlCommand(querySeat,conn);
comQuerySeat.Parameters.AddWithValue("@sitting",i);
comQuerySeat.Parameters.AddWithValue("@event", zevent.Text);
conn.Open();
resultSeat = comQuerySeat.ExecuteScalar();
conn.Close();
if ((resultSeat == null) || (resultSeat == DBNull.Value))
break;
txt_sitting.Text = (i+1).ToString();
}
}
if (txt_sitting.Text == "") txt_sitting.Text = "0";
感谢您的时间。
答案 0 :(得分:0)
如果您使用的是SQL Server 2012,只需使用lag()
功能查找差距后的下一条记录:
select s.intcol
from (select s.intcol, lag(intcol) over (order by intcol) as prevval
from sitting s
) s
where prevval <> intcol - 1;
你用相关的子查询做同样的事情。
编辑:
要获取4
,请改用lead()
并添加1:
select s.intcol + 1
from (select s.intcol, lead(intcol) over (order by intcol) as nextval
from sitting s
) s
where nextval <> s.intcol + 1;
使用相关子查询执行此操作:
select s.intcol + 1
from (select s.intcol,
(select top 1 s2.intcol
from sitting s2
where s2.intcol > s.intcol
order by s2.intcol
) as nextval
from sitting s
) s
where nextval <> s.intcol + 1;
答案 1 :(得分:0)
这应该有效
Select TOP 1 ISNULL(NextID, (Select MAX(ID) + 1 from Table)) from
(Select ID, Row_Number() OVER (Order by ID) NextID from Table) a
where ID <> NextID
答案 2 :(得分:0)
E.g。
using (var adapter = new SqlDataAdapter("SELECT ID FROM MyTable", "connection string here"))
{
var table = new DataTable();
adapter.Fill(table);
var ids = table.AsEnumerable().Select(row => row.Field<int>("ID")).ToArray();
var minId = ids.Min();
var maxId = ids.Max();
var missingIds = Enumerable.Range(minId, maxId - minId + 1).Except(ids);
}
答案 3 :(得分:0)
您正在寻找的是: 具有“坐”值X的记录,其中没有记录具有“坐标”值X + 1
这可以表示为SQL查询:
SELECT sitting + 1
FROM klient
WHERE NOT EXISTS (
SELECT sitting
FROM klient AS klientInner
WHERE klientInner.sitting = klient.sitting + 1
)
这将检索所有间隙。如果您只想知道第一个差距,并且想要处理根本没有记录的情况,您可以执行以下操作
SELECT ISNULL(MIN(sitting + 1), 0)
FROM ...
...
注意:如果有数百万条记录,我不知道其性能如何。在使用此查询之前,应该明智地查看它。
我刚才注意到此解决方案不包括案例:1,2,3,5,6,7,8
应该返回0
您可以使用单独的查询进行检查。