如何选择具有字段

时间:2017-04-18 13:59:42

标签: sql postgresql duplicates

使用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;

2 个答案:

答案 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