SQL SERVER 一组数据按规律横着放置,少则补空,如人员按一进一出的规律,进出为一组,缺少的补null

假设一组数据:人员进出刷卡数据表【SwingCard】

ID MenID Door
1 1 In
2 1 In
3 1 Out
4 1 In
5 1 Out
6 1 Out

 

 

 

 

 

 

 

 

 

想要变成如下:一进一出为一组横着排放,缺少数据的补null

MenID Door1 Door2
1 In null
1 In Out
1 In Out
1 null Out

 

 

 

 

 

 

 

实现:

复制代码
--重新排序,序号为浮点型,装入临时表#Copy
select MenID,Door,Row=(Row_Number() over(order by ID)+0.0) into #Copy from SwingCard
--插入一行空数据到临时表#Copy头部
insert into #Copy(MenID,Door,Row) values1null , 0.0--相邻之间错位连接
with tempLink as (select a.MenID,a.Door Door1,b.Door Door2,a.Row from #Copy a left join #Copy b on a.Row=b.Row-1),
--将相邻之间Door相同的查出来(Door相同,表示该处缺少数据)
tempLoss as (select MenId,Null Door,Row+0.5 Row from tempLink where Door1=Door2)
--将缺少的数据补到#Copy
insert into #Copy(MenID,Door,Row) select * from tempLoss;
--对插入数据的临时表#Copy重新排序(此时临时表已经补全数据)
with tempNew as (select top 100000 MenID,Door,Row=Row_Number() Over(order by Row) from #Copy),
--相邻之间再次错位连接
with tempNewLink as (select a.MenID,a.Door Door1,b.Door Door2 from tempNew  a left join tempNew  b on a.Row=b.Row-1)
--获取正确数据
select * from tempNewLink  where Door1='In' or Door2='Out'
--删除临时表
drop table #Copy
复制代码

 

posted @   木狼  阅读(348)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示