重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这个问题无法由SQLServer自动解决的。
创新互联专注于右玉网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供右玉营销型网站建设,右玉网站制作、右玉网页设计、右玉网站官网定制、微信小程序开发服务,打造右玉网络公司原创品牌,更为您提供右玉网站排名全网营销落地服务。
想要解决的话。一种办法是取消字段的自动增长,写【instead of 触发器】,但是相对于大量的表来说这种方式耗时间,且触发器过多会影响SQLServer性能。
但是序号不连续的数据并不影响你的sql语句操作的,没有特殊需要的话,不要纠结序号的连续
以下以2013年11月为例
1、使用横向连接,以5天为例,简单但不易扩展
with data as ( select * from yourtable where date='2013-11-01' and date'2013-12-01')
select distinct name
from data t1 join data t2 on t1.name=t2.name and t1.date=t2.date+1
join data t3 on t2.name=t3.name and t2.date=t3.date+1
join data t4 on t3.name=t4.name and t3.date=t4.date+1
join data t5 on t4.name=t5.name and t4.date=t5.date+1
2、使用纵向分组统计
with t1(id,rq) as (
select distinct 人员, date from 表 where date='2013-11-01' and date'2013-12-01' ),
--t1求出指定月的人员编号及不同的打卡日期
t2 as (select s2.* from t1 s1 join t1 s2 on s1.id=s2.id and s1.rq=s2.rq-1),
--t2求出所有上一日也打过卡的日期
t3 as (select * from t1 except select * from t2),
--t3求出所有上一日未打过卡的日期
t as (
select id,rq,1 days from t3
union all
select t1.id,t1.rq,t.days+1 from t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
--t4递归调用,每连续一日days+1,就是求每一打卡时间是连续的第几天
select id
from t
group by id
having max(days)=5
order by id
以上就不删了,以下可以改短点吧
with t as (
select 人员 id, date rq, 1 days from 表 t1
where not exists(select * from 表 t2 where t2.date=t1.date-1)
union all
select t1.id,t1.rq,t.days+1 from 表 t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
select id
from t
group by id
having max(days)=5
order by id
不用写sql就行。
你先删除,然后右键表名,设计,把id列删除掉,保存,然后再右键,设计,添加一个id列,然后设置成自增id就行了。
前提是,你之前的id没有跟其他表有什么关联,否则就弄错了。对应不上。