使用Join与Distinct对比唯一家庭ID时添加时间戳失效问题
问题原因与解决方案
为什么加了e.imp_ts后DISTINCT看似失效?
DISTINCT的核心逻辑是对返回的整行数据做唯一性校验,不是只针对某几列。
- 第一个查询只选
e.household_id和a.hhid,DISTINCT会过滤掉这两列组合完全重复的行,所以结果里的家庭ID对都是唯一的。 - 加了
e.imp_ts之后,DISTINCT要判断的是三列的组合是否唯一。哪怕同一个家庭ID对(e.household_id+a.hhid)对应不同的时间戳,这两行的三列组合是不一样的,所以都会被保留下来。你看到的“重复家庭ID”,其实是不同时间戳对应的同ID行,整行数据是唯一的,DISTINCT并没有失效。
举个实际例子:
假设exposure表中有两行数据:
| household_id | imp_ts |
|---|---|
| 123 | 2024-01-01 10:00:00 |
| 123 | 2024-01-02 14:30:00 |
audience表中hhid=123只有一行。
第一个查询返回:
| household_id | hhid |
|---|---|
| 123 | 123 |
第二个查询返回:
| household_id | hhid | imp_ts |
|---|---|---|
| 123 | 123 | 2024-01-01 10:00:00 |
| 123 | 123 | 2024-01-02 14:30:00 |
这两行的三列组合不同,所以DISTINCT会保留它们,看起来家庭ID重复了,但这是符合逻辑的。
若要保留家庭ID唯一性同时显示时间戳
如果你的需求是每个家庭ID组合只显示一行(比如最新/最早的时间戳),应该用GROUP BY配合聚合函数,而非DISTINCT:
select e.household_id, a.hhid, MAX(e.imp_ts) as latest_imp_ts FROM [dbo].[exposure] e left outer join [dbo].[audience] a on e.household_id = a.hhid GROUP BY e.household_id, a.hhid
这里GROUP BY按家庭ID组合分组,MAX(e.imp_ts)取每组里最新的时间戳,确保结果里的家庭ID组合唯一。
内容的提问来源于stack exchange,提问作者Cladderin
相关产品推荐
相关产品推荐

