sql - 在 PostgreSQL 中,如何返回与最小值对应的整行?

标签 sql postgresql min amazon-redshift

如果我有一张这样的 table

id | value | detail
-------------------
12 | 20    | orange
12 | 30    | orange
13 | 16    | purple
14 | 50    | red
12 | 60    | blue

我怎样才能让它返回这个?

12 | 20 | orange
13 | 16 | purple
14 | 50 | red

如果我按 id 和详细信息分组,它将返回 12 | 20 |橙色和12 | 60|蓝色

最佳答案

SQL Fiddle

PostgreSQL 9.3 架构设置:

CREATE TABLE TEST( id INT, value INT, detail VARCHAR );
INSERT INTO TEST VALUES ( 12, 20, 'orange' );
INSERT INTO TEST VALUES ( 12, 30, 'orange' );
INSERT INTO TEST VALUES ( 13, 16, 'purple' );
INSERT INTO TEST VALUES ( 14, 50, 'red' );
INSERT INTO TEST VALUES ( 12, 60, 'blue' );

查询 1:

不确定 Redshift 是否支持此语法:

SELECT DISTINCT
       FIRST_VALUE( id ) OVER wnd AS id,
       FIRST_VALUE( value ) OVER wnd AS value,
       FIRST_VALUE( detail ) OVER wnd AS detail
FROM   TEST
WINDOW wnd AS ( PARTITION BY id ORDER BY value )

<强> Results :

| id | value | detail |
|----|-------|--------|
| 12 |    20 | orange |
| 14 |    50 |    red |
| 13 |    16 | purple |

查询 2:

SELECT t.ID,
       t.VALUE,
       t.DETAIL
FROM (
  SELECT *,
         ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY VALUE ) AS RN
  FROM   TEST
) t
WHERE  t.RN = 1

<强> Results :

| id | value | detail |
|----|-------|--------|
| 12 |    20 | orange |
| 13 |    16 | purple |
| 14 |    50 |    red |

关于sql - 在 PostgreSQL 中,如何返回与最小值对应的整行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30947175/

相关文章:

mysql - 如何在一个字段中获取最大时间和最小时间?

python - 使用 "min"的函数的水平集

sql - Mysql创建插入过程语句不完整

python - 在 python 中使用 SQLAlchemy 将行迭代地插入到 postgreSQL 数据库中

持久化引用和删除引用对象的 SQL 实践

c# List<Tuple<string, string, int>> group by min max int

c# - 使用 Entity Framework 6 返回具有最大列值的记录

Mysql 查询 : LEFT JOIN List all orders and "balance due" for a customer, 如果没有订单,则列出客户。 3 table

SQL:跨多个表计算最大日期

sql - 如何使用 PostGIS 创建和查询包含经/纬度的表?