在int值列中找到差距

时间:2014-02-05 12:57:20

标签: c# sql .net sql-server

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";

感谢您的时间。

4 个答案:

答案 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 您可以使用单独的查询进行检查。