您好,在我的2008 SQL Server中,我有一个包含int值的列sitting,如下所示
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";谢谢您抽时间见我。
发布于 2014-02-05 21:04:10
如果您使用的是SQL Server2012,只需使用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;发布于 2014-02-05 21:07:24
这应该是可行的
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发布于 2014-02-05 21:09:14
例如。
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);
}https://stackoverflow.com/questions/21577963
复制相似问题