如何用SQL按时间生成idTime?现有查询结果错误求修正
修正SQL生成idTime字段的问题
需求说明
需要生成idTime字段,规则为:按empID和date分组,每组内按time升序生成从1开始的递增序号,预期效果如下:
| empID | date | time | idTime |
|---|---|---|---|
| 10001 | 01-07-2022 | 07:30:01 | 1 |
| 10001 | 01-07-2022 | 16:30:01 | 2 |
| 10001 | 02-07-2022 | 07:30:01 | 1 |
| 10001 | 03-07-2022 | 23:30:01 | 1 |
| 10001 | 03-07-2022 | 14:30:01 | 2 |
| 10001 | 03-07-2022 | 24:30:01 | 3 |
| 10002 | 01-07-2022 | 07:30:01 | 1 |
| 10002 | 01-07-2022 | 17:30:01 | 2 |
原SQL问题分析
你编写的SQL语句存在语法错误:
SELECT empId, dt, tm, ROW_NUMBER() OVER (PARTITION BY empId AND dt ORDER BY tm ASC)idTime FROM attEmp order by empId, dt ASC, tm ASC
错误点在于PARTITION BY子句中,多字段分区应该用逗号分隔,而非AND。使用AND会将empId和dt的逻辑运算结果作为分区依据,导致分区逻辑完全错误,无法按预期分组生成序号。
修正后的SQL
SELECT empId, dt, tm, ROW_NUMBER() OVER (PARTITION BY empId, dt ORDER BY tm ASC) AS idTime FROM attEmp ORDER BY empId, dt ASC, tm ASC
修正说明
- 将
PARTITION BY empId AND dt改为PARTITION BY empId, dt,实现按员工ID和日期的组合进行分区 - 为
idTime字段添加AS关键字,使语法更规范(部分数据库允许省略,但添加后可读性更强)
执行修正后的SQL即可得到符合预期的idTime序号。
内容的提问来源于stack exchange,提问作者rejak
相关产品推荐
相关产品推荐

