请求生成IN_OUT_RECORD表每日仅单条IN/OUT记录的SQL语句
需求说明
对IN_OUT_RECORD表执行以下查询时:
select DISTINCT * from IN_OUT_RECORD AD where (AD_USER_ID = 'ST1301220007') AND (AD.AD_DATE BETWEEN '2024-06-01 00:00:00' AND ('2024-06-12 23:59:00'));
返回结果中存在同一日期有多条IN或OUT记录的情况。现需修改SQL,实现每日仅保留1条最早的IN记录和1条最晚的OUT记录,若当天只有其中一种状态的记录,则保留该有效记录。
解决方案SQL语句
通过窗口函数ROW_NUMBER()按日期和状态分组筛选,可实现需求:
SELECT AD_ID, AD_USER_ID, AD_STATUS, AD_DATE FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY DATE(AD_DATE), AD_STATUS ORDER BY CASE AD_STATUS WHEN 'IN' THEN AD_DATE ELSE AD_DATE DESC END ) AS rn FROM IN_OUT_RECORD WHERE AD_USER_ID = 'ST1301220007' AND AD_DATE BETWEEN '2024-06-01 00:00:00' AND '2024-06-12 23:59:00' ) t WHERE rn = 1 ORDER BY DATE(AD_DATE), AD_STATUS;
语句说明
PARTITION BY DATE(AD_DATE), AD_STATUS:按日期(提取AD_DATE的日期部分)和状态分组,确保同一天同状态的记录单独处理ORDER BY CASE AD_STATUS WHEN 'IN' THEN AD_DATE ELSE AD_DATE DESC END:对IN状态按时间升序取最早的一条,对OUT状态按时间降序取最晚的一条- 外层筛选
rn=1,保留每组的目标记录,最后按日期和状态排序
目标结果示例
| AD_ID | AD_USER_ID | AD_STATUS | AD_DATE |
|---|---|---|---|
| 11277 | ST1301220007 | IN | 2024-06-01 09:10:40 |
| 11280 | ST1301220007 | OUT | 2024-06-01 18:21:23 |
| 11281 | ST1301220007 | IN | 2024-06-05 09:20:21 |
| 11282 | ST1301220007 | OUT | 2024-06-05 19:05:22 |
| 11283 | ST1301220007 | IN | 2024-06-07 09:05:25 |
| 11284 | ST1301220007 | OUT | 2024-06-07 18:05:25 |
| 11287 | ST1301220007 | IN | 2024-06-08 09:11:50 |
内容的提问来源于stack exchange,提问作者Raj Kumar
相关产品推荐
相关产品推荐

