多字段分区并为每个分区组分配相同组编号的实现方法
问题描述
我有如下数据集:
| CarType | Date | Car |
|---|---|---|
| Honda | 5/28/2022 | car1 |
| Honda | 5/28/2022 | car1 |
| Honda | 8/11/2022 | car2 |
| Honda | 8/11/2022 | car2 |
| BMW | 5/28/2022 | car1 |
| BMW | 5/28/2022 | car1 |
| BMW | 8/11/2022 | car2 |
| BMW | 8/11/2022 | car2 |
希望生成一个名为Expected的列,结果如下:
| CarType | Date | Car | Expected |
|---|---|---|---|
| Honda | 5/28/2022 | car1 | 1 |
| Honda | 5/28/2022 | car1 | 1 |
| Honda | 8/11/2022 | car2 | 2 |
| Honda | 8/11/2022 | car2 | 2 |
| BMW | 5/28/2022 | car1 | 1 |
| BMW | 5/28/2022 | car1 | 1 |
| BMW | 8/11/2022 | car2 | 2 |
| BMW | 8/11/2022 | car2 | 2 |
我尝试了以下查询,但未得到正确结果:
select CarType, Date, Car,ROW_NUMBER() OVER (PARTITION BY CarType, Car ORDER BY Date ASC) AS RW from table
解决方案
你的需求是同一CarType下,相同Car(对应相同Date)的行要得到相同的序号,而ROW_NUMBER()会给同一分组内的每行生成唯一序号,所以不适用。应该用RANK()或者DENSE_RANK(),同时调整分区和排序逻辑:
方法1:使用DENSE_RANK()
SELECT CarType, Date, Car, DENSE_RANK() OVER (PARTITION BY CarType ORDER BY Date, Car) AS Expected FROM your_table_name;
方法2:使用RANK()
SELECT CarType, Date, Car, RANK() OVER (PARTITION BY CarType ORDER BY Date, Car) AS Expected FROM your_table_name;
说明
- 分区改为
PARTITION BY CarType:按车型分组,在每个车型内部计算序号 - 排序用
ORDER BY Date, Car:确保同一Date和Car的行被归为同一组,获得相同的序号 DENSE_RANK()和RANK()在这里效果一致,因为同一分组内没有间隔的排名情况。如果后续有跳过的场景,DENSE_RANK()会连续编号,RANK()会跳过重复的序号位置。
内容的提问来源于stack exchange,提问作者genie
相关产品推荐
相关产品推荐

