基于序列号提取PostgreSQL Telephone表数据的SQL查询问题
问题:提取每个ID/tel_type_cde组合的最新记录(tel_seq_num最大)
需求说明
需要从Telephone表中,为每个ID/tel_type_cde组合提取出tel_seq_num值最大的那条记录。
原始表数据
| ID | area | exch | line | ext | tel_type_cde | tel_seq_num | modified_dttm |
|---|---|---|---|---|---|---|---|
| 1234 | 482 | 876 | 789 | 1234 | 0 | 0 | 01-01-2023 |
| 1234 | 483 | 877 | 123 | 0 | 1 | 01-02-2023 | |
| 1234 | 123 | 234 | 456 | 1234 | 1 | 0 | 01-01-2023 |
| 1235 | 483 | 877 | 456 | 0 | 1 | 01-01-2023 | |
| 1236 | 483 | 877 | 123 | 0 | 0 | 01-02-2023 | |
| 1236 | 123 | 234 | 456 | 1234 | 0 | 1 | 01-02-2023 |
| 1236 | 483 | 877 | 458 | 0 | 2 | 01-03-2023 |
预期输出结果
| ID | area | exch | line | ext | tel_type_cde |
|---|---|---|---|---|---|
| 1234 | 483 | 877 | 123 | 0 | |
| 1234 | 123 | 234 | 456 | 1234 | 1 |
| 1235 | 483 | 877 | 456 | 0 | |
| 1236 | 483 | 877 | 458 | 0 |
问题SQL(未得到预期结果)
select distinct on (ID) ID, area, exch, line, ext, tel_type_cde from telephone order by ID,tel_seq_num desc;
修正后的SQL
select distinct on (ID, tel_type_cde) ID, area, exch, line, ext, tel_type_cde from telephone order by ID, tel_type_cde, tel_seq_num desc;
修正说明
原SQL的问题在于distinct on (ID)仅按单个ID字段去重,无法区分同一ID下不同tel_type_cde的组合。我们需要将ID和tel_type_cde同时作为去重依据,这样才能为每个组合保留tel_seq_num最大的记录。对应的order by子句也要先按这两个字段排序,再按tel_seq_num降序排列,确保每个组合中最大的tel_seq_num记录排在最前面,被distinct on选中。
内容的提问来源于stack exchange,提问作者datatester
相关产品推荐
相关产品推荐

