查询基于一列去重
Query to deduplicate based on one columns
我的数据在 Teradata 中看起来像这样
| load_number | id | time | slot_time | region | network |
|-------------|-----------|----------|-----------|--------|---------|
| 1692 | 641131146 | 00:20:00 | 00:20:00 | FX-4 | SBOB |
| 1692 | 641131146 | 00:20:00 | 00:20:30 | FX-4 | SBOB |
| 1442 | 570732257 | 00:20:00 | 00:20:00 | FX-4 | SBOB |
| 1442 | 570732257 | 00:20:00 | 00:20:30 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:00 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:30 | FX-4 | SBOB |
| 1442 | 570732258 | 00:55:00 | 00:55:00 | FX-4 | SBOB |
| 1442 | 570732258 | 00:55:00 | 00:55:30 | FX-4 | SBOB |
| 14 | 123456 | 00:20:00 | 00:20:00 | ABC | XYZ |
| 14 | 123456 | 00:20:00 | 00:20:30 | ABC | XYZ |
| 19 | 234567 | 00:20:00 | 00:20:00 | ABC | XYZ |
| 19 | 234567 | 00:20:00 | 00:20:30 | ABC | XYZ |
如何构建我的 sql 查询来提取最新加载的数据,如下所示:
| load_number | id | time | slot_time | region | network |
|-------------|-----------|----------|-----------|--------|---------|
| 1692 | 641131146 | 00:20:00 | 00:20:00 | FX-4 | SBOB |
| 1692 | 641131146 | 00:20:00 | 00:20:30 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:00 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:30 | FX-4 | SBOB |
| 19 | 234567 | 00:20:00 | 00:20:00 | ABC | XYZ |
| 19 | 234567 | 00:20:00 | 00:20:30 | ABC | XYZ |
除了id
和load_number
,基本上每个字段都会匹配。因此,假设除了这两个字段之外的每个字段都匹配,我可以通过获取具有更高 load_number
的行来删除 'duplicates'。 region
和 network
列中的数据可能不同,load_number
也可能不同。
我正在考虑 load_number
上的某种降序 rank() 或对除 id
和 load_number
以外的所有字段匹配的所有列进行窗口化,然后取最高 load_number ,非常感谢任何帮助!
如果我没理解错的话,你可以用row_number()
和qualify
:
select t.*
from t
qualify row_number() over (partition by time, slot_time, region, network order by load_number desc) = 1
我的数据在 Teradata 中看起来像这样
| load_number | id | time | slot_time | region | network |
|-------------|-----------|----------|-----------|--------|---------|
| 1692 | 641131146 | 00:20:00 | 00:20:00 | FX-4 | SBOB |
| 1692 | 641131146 | 00:20:00 | 00:20:30 | FX-4 | SBOB |
| 1442 | 570732257 | 00:20:00 | 00:20:00 | FX-4 | SBOB |
| 1442 | 570732257 | 00:20:00 | 00:20:30 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:00 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:30 | FX-4 | SBOB |
| 1442 | 570732258 | 00:55:00 | 00:55:00 | FX-4 | SBOB |
| 1442 | 570732258 | 00:55:00 | 00:55:30 | FX-4 | SBOB |
| 14 | 123456 | 00:20:00 | 00:20:00 | ABC | XYZ |
| 14 | 123456 | 00:20:00 | 00:20:30 | ABC | XYZ |
| 19 | 234567 | 00:20:00 | 00:20:00 | ABC | XYZ |
| 19 | 234567 | 00:20:00 | 00:20:30 | ABC | XYZ |
如何构建我的 sql 查询来提取最新加载的数据,如下所示:
| load_number | id | time | slot_time | region | network |
|-------------|-----------|----------|-----------|--------|---------|
| 1692 | 641131146 | 00:20:00 | 00:20:00 | FX-4 | SBOB |
| 1692 | 641131146 | 00:20:00 | 00:20:30 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:00 | FX-4 | SBOB |
| 1692 | 641131147 | 00:55:00 | 00:55:30 | FX-4 | SBOB |
| 19 | 234567 | 00:20:00 | 00:20:00 | ABC | XYZ |
| 19 | 234567 | 00:20:00 | 00:20:30 | ABC | XYZ |
除了id
和load_number
,基本上每个字段都会匹配。因此,假设除了这两个字段之外的每个字段都匹配,我可以通过获取具有更高 load_number
的行来删除 'duplicates'。 region
和 network
列中的数据可能不同,load_number
也可能不同。
我正在考虑 load_number
上的某种降序 rank() 或对除 id
和 load_number
以外的所有字段匹配的所有列进行窗口化,然后取最高 load_number ,非常感谢任何帮助!
如果我没理解错的话,你可以用row_number()
和qualify
:
select t.*
from t
qualify row_number() over (partition by time, slot_time, region, network order by load_number desc) = 1