使用PostgreSQL,我试图找到一种方法来选择每个行来复制某个列的值。
例如,我的表格如下:
id | username | email
1 | abc | abc@test.com
2 | abc1 | abc@test.com
3 | def | def@test.com
4 | ghi | ghi@test.com
5 | ghi1 | ghi@test.com
我想要的输出会选择用户名和电子邮件,其中电子邮件数量> 2:
abc | abc@test.com
abc1 | abc@test.com
ghi | ghi@test.com
ghi1 | ghi@test.com
我已经尝试了group by having
,这让我接近我想要的,但我认为我不想使用group by
,因为这实际上会将行与重复值组合在一起,我仍然想要显示包含重复值的单独行。
SELECT email FROM auth_user
GROUP BY email HAVING count(*) > 1;
这只显示了具有重复值的电子邮件:
abc@test.com
ghi@test.com
我可以在SELECT email, count(*) FROM ...
中加入计数,但这不是我想要的。
我想我想要where count(email) > 1
这样的内容,但这会让我错误地说ERROR: aggregate functions are not allowed in WHERE
如何在不对其进行分组的情况下选择重复值?
使用解决方案更新:
@GordonLinoff发布了正确答案。但是为了满足我只获取用户名和电子邮件字段的确切需求,我已经修改了一点(这应该是自我解释的,但发布以防其他人需要确切的查询)
select username, email
from (select username, email, count(*)
over (partition by email) as cnt
from auth_user au
) au
where cnt > 1;
答案 0 :(得分:3)
如果您想要所有原始行,那么我建议使用select au.*
from (select au.*, count(*) over (partition by email) as cnt
from auth_user au
) au
where cnt > 1;
作为窗口函数:
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
progressBar.setVisibility(View.VISIBLE);
button2 = (Button) findViewById(R.id.button);
button2.setVisibility(View.GONE);
Log.d("email", email);
email = emailView.getText().toString();
Log.d("email2", email);
password = passwordView.getText().toString();
connection.start();
try {
connection.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("00", "00");
Log.d("11", "11");
if (!validate()) {
onFailed();
clearForm((ViewGroup) findViewById(R.id.lin));
progressBar.setVisibility(View.INVISIBLE);
button2.setVisibility(View.VISIBLE);
} else {
screenSize();
}
}
});
}
答案 1 :(得分:0)
您可能会发现这也很有用:
select t1.*, t2.*
from auth_user t1, auth_user t2
where t1.id != t2.id
and t1.email = t2.email