Sql Postgres:选择字段计数大于1的所有行

Sql Postgres:选择字段计数大于1的所有行,sql,postgresql,Sql,Postgresql,我有一个存储产品价格信息的表,该表类似于(否是主键) 现在我想选择“name”字段在表中多次出现的所有行。基本上,我希望查询返回前三行 我试过: SELECT * FROM product_price_info GROUP BY name HAVING COUNT(*) > 1 但我得到一个错误,说: 列“product\u price\u info.no”必须出现在GROUP BY子句中,或在聚合函数中使用 试试这个: SELECT no, name, price, "date"

我有一个存储产品价格信息的表,该表类似于(否是主键)

现在我想选择“name”字段在表中多次出现的所有行。基本上,我希望查询返回前三行

我试过:

SELECT * FROM product_price_info GROUP BY name HAVING COUNT(*) > 1  
但我得到一个错误,说:

列“product\u price\u info.no”必须出现在GROUP BY子句中,或在聚合函数中使用

试试这个:

SELECT no, name, price, "date"
FROM (
  SELECT no, name, price, "date",
         COUNT(*) OVER (PARTITION BY name) AS cnt 
  FROM product_price_info ) AS t
WHERE t.cnt > 1

您可以使用
COUNT
的窗口版本来获取每个
name
分区的填充。然后,在外部查询中,筛选出填充数小于2的分区。

自连接版本,使用返回多次出现的名称的子查询

select t1.*
from tablename t1
join (select name from tablename group by name having count(*) > 1) t2
  on t1.name = t2.name
基本上与/
中的
相同
存在
版本,但可能快一点。

非常适合这一点

SELECT * 
FROM product_price_info 
WHERE name IN (SELECT name 
               FROM product_price_info 
               GROUP BY name HAVING COUNT(*) > 1)
SELECT p.*, count(*) OVER (PARTITION BY name) FROM product p;
举一个完整的例子:

CREATE TABLE product (no SERIAL, name text, price NUMERIC(8,2), date DATE);

INSERT INTO product(name, price, date) values
('paper', 1.99, '2017-03-23'),
('paper', 2.99, '2017-05-25'),
('paper', 1.99, '2017-05-29'),
('orange', 4.56, '2017-04-23'),
('apple', 3.43, '2017-03-11')
;

WITH report AS (
  SELECT p.*, count(*) OVER (PARTITION BY name) as count FROM product p
)
SELECT * FROM report WHERE count > 1;
给出:

 no |  name  | price |    date    | count
----+--------+-------+------------+-------
  1 | paper  |  1.99 | 2017-03-23 |     3
  2 | paper  |  2.99 | 2017-05-25 |     3
  3 | paper  |  1.99 | 2017-05-29 |     3
(3 rows)

最好(如在更快的情况下)根据官方文档使用例如
COUNT(id)
。不错,但这并不能完全回答op的问题question@Madbreaks谢谢你接电话。我更新了答案。
 no |  name  | price |    date    | count
----+--------+-------+------------+-------
  1 | paper  |  1.99 | 2017-03-23 |     3
  2 | paper  |  2.99 | 2017-05-25 |     3
  3 | paper  |  1.99 | 2017-05-29 |     3
(3 rows)