如何在SQL中为相同JOB_ID和APPLICANT_ID生成连续计数?
如何按JOB_ID和APPLICANT_ID分组生成连续计数字段
我有如下结构的原始数据表:
| JOB_ID | APPLICANT_ID | DATE | STATUS |
|---|---|---|---|
| 1 | A | 01/01/2020 | Stage 1 |
| 1 | A | 01/01/2020 | Accepted |
| 2 | A | 01/01/2020 | Rejected |
| 1 | B | 02/01/2020 | Stage 1 |
| 1 | B | 02/02/2020 | Stage 2 |
| 1 | B | 02/03/2020 | Accepted |
我希望新增一个COUNT字段,对相同JOB_ID和APPLICANT_ID的行按顺序生成连续计数,得到如下结果:
| JOB_ID | APPLICANT_ID | DATE | STATUS | COUNT |
|---|---|---|---|---|
| 1 | A | 01/01/2020 | Stage 1 | 1 |
| 1 | A | 01/02/2020 | Accepted | 2 |
| 2 | A | 01/01/2020 | Rejected | 1 |
| 1 | B | 02/01/2020 | Stage 1 | 1 |
| 1 | B | 02/02/2020 | Stage 2 | 2 |
| 1 | B | 02/03/2020 | Accepted | 3 |
我尝试了COUNT(DISTINCT(JOB_ID, APPLICANT_ID)),但没有达到预期效果,需要正确的SQL实现方法。
正确的SQL实现方法
你需要使用窗口函数ROW_NUMBER(),它能在指定分组内按顺序生成连续序号,语法如下:
SELECT JOB_ID, APPLICANT_ID, DATE, STATUS, ROW_NUMBER() OVER ( PARTITION BY JOB_ID, APPLICANT_ID ORDER BY DATE ASC ) AS COUNT FROM your_table_name;
关键参数说明:
PARTITION BY JOB_ID, APPLICANT_ID:将数据按JOB_ID和APPLICANT_ID分组,每组单独计算序号。ORDER BY DATE ASC:确保每组内的行按日期升序排列,保证序号与时间顺序匹配。ROW_NUMBER():在每个分组内从1开始生成连续整数,完全符合需求的COUNT字段逻辑。
特殊场景处理:
如果你的数据库中DATE字段是字符串格式(如示例中的01/01/2020),需要先转换为标准日期类型再排序,避免排序错误。以MySQL为例:
SELECT JOB_ID, APPLICANT_ID, DATE, STATUS, ROW_NUMBER() OVER ( PARTITION BY JOB_ID, APPLICANT_ID ORDER BY STR_TO_DATE(DATE, '%m/%d/%Y') ASC ) AS COUNT FROM your_table_name;
内容的提问来源于stack exchange,提问作者learning to code
相关产品推荐
相关产品推荐

