首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres:选择字段计数大于1的所有行

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

Stack Overflow用户
提问于 2016-04-01 14:24:43
回答 5查看 70.2K关注 0票数 47

我有存储产品价格信息的表,该表看起来类似,(否是主键)

代码语言:javascript
运行
复制
no   name    price    date
1    paper   1.99     3-23
2    paper   2.99     5-25
3    paper   1.99     5-29
4    orange  4.56     4-23
5    apple   3.43     3-11

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

我试过:

代码语言:javascript
运行
复制
SELECT * FROM product_price_info GROUP BY name HAVING COUNT(*) > 1  

但我说错了:

列"product_price_info.no“必须出现在GROUP子句中,或用于聚合函数中。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-01 14:27:38

代码语言:javascript
运行
复制
SELECT * 
FROM product_price_info 
WHERE name IN (SELECT name 
               FROM product_price_info 
               GROUP BY name HAVING COUNT(*) > 1)
票数 76
EN

Stack Overflow用户

发布于 2016-04-01 14:27:03

试试这个:

代码语言:javascript
运行
复制
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的name分区。

票数 12
EN

Stack Overflow用户

发布于 2017-09-25 15:41:09

窗口函数在这方面真的很好。

代码语言:javascript
运行
复制
SELECT p.*, count(*) OVER (PARTITION BY name) FROM product p;

举一个完整的例子:

代码语言:javascript
运行
复制
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;

给予:

代码语言:javascript
运行
复制
 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)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36358833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档