在连接后从列中获取不同值时的冗余值

时间:2017-10-01 11:53:41

标签: sql postgresql

当我尝试从postgres数据库中获取唯一的电子邮件ID时,我仍然获得了多余的值。查询如下:

select distinct(t2.email_id), user_id, registration_date, 
  last_login, status, count_uo  
from (
  select t1.* 
  from (
    select distinct(u.email_id), u.user_id, 
      u.registration_date, u.last_login, 
      u.status, count(distinct(uo.id)) as count_uo 
    from users u 
    join user_offers uo on u.user_id = uo.user_id 
      and u.email_id != ''  
      and uo.offer_id in ('13', '9', 18, 7, 19, 25) 
    join user_utils uu on u.user_id = uu.user_id 
      and uu.carrier ~* 'Airtel' 
      or  uu.carrier ~* 'Jio' 
      or  uu.carrier ~* 'Idea' 
      or  uu.carrier ~* '!dea' 
    where u.registration_date::date between date'2016-08-04' and date'2017-09-28' 
      and u.last_login::date between date'2017-06-01' and date'2017-09-29' 
      and u.gender = 'm' 
      and u.status = 'sms-verified' 
      and u.email_verification_status = 'UN-VERIFIED' 
      and u.email_id != '' group by u.user_id
    ) as t1 
  where t1.count_uo >1 and t1.count_uo < 100
) t2; 

即使应用了两次不同的输出,我也得到如下输出。

email_id       | user_id |     registration_date      |         last_login         |    status    | count_uo 
---------------+---------+----------------------------+----------------------------+--------------+----------
 abc@gmail.com |     509 | 2017-07-26 16:59:50.608219 | 2017-07-26 17:56:54.88664  | sms-verified |        3
 def@gmail.com |     518 | 2017-08-18 19:26:45.217283 | 2017-08-22 15:38:01.591841 | sms-verified |        3
 abc@gmail.com |     512 | 2017-08-17 12:01:00.003048 | 2017-08-21 17:52:56.303841 | sms-verified |        3

由于我在SQL方面很弱,所以非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您使用的是Postgres,则可以使用distinct on

select distinct on (t2.email_id) t2.email_id, user_id,
       registration_date, last_login, status, count_uo  
from ( . . . ) t2
order by t2.email_id;

您可以向order by添加第二个密钥以获取特定行(使用order by t2.email_id, last_login desc表示最近的登录信息)。

答案 1 :(得分:0)

您有两个用户(行),其中'abc @gmail.com'为 email_id :请注意, user_id 中的不同值专栏(509和512)。

正如@GordonLinoff所说,你可以使用DISTINCT ON子句隐藏其中一个结果。但我发现这不是你想要的......

我想你更有可能插入一些测试数据并在其中复制'abc@gmail.com'。

这也指出(我认为)你的模型定义中的一个错误。 (在用户表中的 email_id user_id 列上缺少 UNIQUE 约束,以避免再次发生我的意思)。