当我尝试从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方面很弱,所以非常感谢任何帮助。
答案 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 约束,以避免再次发生我的意思)。