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) values (1,null , 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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语句:使用策略模式优化代码结构