按配对顺序将刷卡进出记录转为单行记录--AI解决方案

简介: 本方案用SQLazy将刷卡流水按业务规则转为会话记录:先排序,再基于“上条为OUT”或“连续IN”条件智能分段,最后按段聚合生成IN/OUT时间对,落单动作自动补NULL。全程4步声明式表达,告别嵌套SQL。

问题描述

某库记录了人员刷卡进出建筑的流水, 每个时间点有一条记录, 字段为 username、building、action(IN/OUT)、timestamp。正常情况下同一人同一建筑的记录成对出现, 先 IN 后 OUT; 但实际数据会出现不成对、连续同向动作等脏数据。现在要把每个人每栋建筑的每对记录由行转列变成一条记录, 不成对的记录单独转为一条记录, 空缺部分填 NULL,即按配对顺序把纵向流水转为横向会话。

源数据
image.png
期望结果
image.png
以 user-3/building-1 为例,原始序列为 OUT, IN, IN, IN, OUT, OUT, OUT,按配对规则切为 6 段:首条 OUT 落单,随后两条 IN 各落单,第四条 IN 与首条 OUT 配对成一行,最后两条 OUT 各落单。连续同向动作不会被强行配对,保证会话边界正确,13 行结果中该用户占 6 行正是此逻辑的体现。

SQLazy 分步实现

核心思路:先按 username、building、timestamp 排序,把同一人同一建筑的流水排成时间顺序;再用条件分段识别会话边界,上一条是 OUT 或当前是 IN 就新开一组,这样每组恰好包含至多一个 IN 和至多一个 OUT;最后按 username、building、seg 分组,用带条件的 max 聚合把组内 IN 时间与 OUT 时间分别收敛到同一行,落单则为 NULL。
image.png
下面逐一解释这些步骤。

第 1 步: 按人、建筑、时间排序

sort username, building, timestamp asc

将同一人同一建筑的记录按 timestamp 升序排列, 确保后续按时间顺序判断配对边界; 用户名与建筑作为排序前置键, 保证分区内顺序与分区键一致, 排序是后续分段与汇总的前提。
e84d02a3c78eb8abb8cc1cfecef4d93f_f4524489b9854a95b599e30cbfe62f4a_Picture1.png
第 2 步: 按配对语义条件分段, 生成 seg

segment condition ((action[-1] = "OUT")or (action[-1] = "IN" and action = "IN")) partition username, building as seg

最关键的一步是用条件分段表达会话边界:上一条是 OUT,或上一条是 IN 且当前也是 IN 就新开一组。上一条 OUT 表示上一会话已闭合,应新开;连续 IN 表示多刷进入,每多一次 IN 就切一组,避免把多条 IN 塞进同一会话。partition username, building 保证不同人、不同建筑互不干扰,各自独立编号 seg。条件中 action[-1] 是 SQLazy 的相对位置写法,等价于 LAG(action,1),无需手写窗口函数。

ab01021c38a764807df6779335f7a19d_bb957e4beba84fa9910ba6e29a3f5d5d_Picture2.png
第 3 步: 按人、建筑、段号分组, 条件汇总行转列

summarize condition (action = "IN") max timestamp as 'IN', condition (action = "OUT") max timestamp as 'OUT'; group username, building, seg

按 username、building、seg 分组, 每组至多包含一进一出。汇总时用条件聚合:action="IN" 时取 timestamp 的 max 作为 IN 列,action="OUT" 时取 timestamp 的 max 作为 OUT 列。max 与 first 在此等价, 因为组内同类动作至多一条; 使用带条件的 max 可使落单组的另一侧自然为 NULL。注意新版语法中求值聚合算法 (max) 在被聚合式 (timestamp) 之前, 分组键通过 "group username, building, seg" 指定。
6045ba798d5659136bfcb3f22137945d_4d42f7a7064646f2a99dfff465ebbf3e_Picture3.png
第 4 步: 清理掉辅助列

derive delete seg

删除分段产生的辅助列 seg, 仅保留 username、building、IN、OUT 四列, 得到最终结果, 表格更干净。

编译生成 SQL
确认上述 4 步逻辑后,SQLazy 编译器自动生成原生 SQL(这里是 Oracle 语法):

SELECT MAX(CASE

SELECT MAX(CASE
        WHEN (action = 'OUT') THEN timestamp
        ELSE NULL
    END) AS "OUT"
    , MAX(CASE
        WHEN (action = 'IN') THEN timestamp
        ELSE NULL
    END) AS "IN"
    , building, username
FROM (
    SELECT username, building, action, timestamp
        , 1 + SUM(CASE
            WHEN (col__2 = 'OUT'
                OR action = 'IN')
            THEN 1
            ELSE 0
        END) OVER (PARTITION BY username, building ORDER BY username ASC, building ASC, timestamp ASC ROWS UNBOUNDED PRECEDING) AS seg
    FROM (
        SELECT t1.*, LAG(action) OVER (PARTITION BY username, building ORDER BY username ASC, building ASC, timestamp ASC) AS col__2
        FROM t1
    ) sub__3
) t_4
GROUP BY username, building, seg
ORDER BY username, building, seg;

SQLazy让你用业务语言描述逻辑,而不是用 SQL 语法写嵌套查询。上面的 NLC 代码,用一句条件分段就能把业务规则说清:segment condition ((action[-1] = "OUT")or (action[-1] = "IN" and action = "IN"))partition username, building,也就是“上一段已结束或连续刷入就新开会话”。手写 SQL 时,你得自己写 LAG 取上一行、SUM OVER 累计段号,再套两层子查询封装窗口列,最后用条件聚合 MAX(CASE...) 做行转列,还要处理分区与排序的一致性。SQLazy 把这些压缩成排序、分段、条件汇总、清理四步,每步都能单独验证,相对位置和分区会编译成窗口函数,条件汇总自动处理 NULL。

相关文章
|
6天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
2747 22
|
1天前
|
云安全 人工智能 安全
|
5天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
6天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1226 5
|
云安全 安全 网络安全
|
7天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
19天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3351 52
|
11天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。