使用PostgreSQL获取聚合,按SQL查询分组的主键

Hae*_*aes 3 sql postgresql

我正在努力创建一个涉及使用PostgreSQL聚合的SQL查询.请考虑以下表格:

CREATE TABLE thing (
  id INT NOT NULL PRIMARY KEY,
  price NUMERIC(10,2) NOT NULL,
  description VARCHAR(255) NOT NULL,
  url VARCHAR(255) NOT NULL,
  location_id INT NOT NULL REFERENCES location(id)
)

CREATE TABLE location (
  id INT NOT NULL PRIMARY KEY,
  type INT NOT NULL,
  name VARCHAR(255) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

现在,我想获得每个位置的所有事物记录,其中location.type = xxx具有最低价格.

就像是:

SELECT min(price) FROM thing
INNER JOIN location ON (thing.location_id = location.id)
WHERE type = xxx
GROUP BY location_id
Run Code Online (Sandbox Code Playgroud)

这将列出类型为xxx的每个位置的最低价格,但是如何从表格中获取这些列的行(或其主键)?

Qua*_*noi 5

使用此PostgreSQL扩展程序:

SELECT  DISTINCT ON (location.id) thing.*
FROM    location
JOIN    thing
ON      thing.location_id = location_id
WHERE   type = 1
ORDER BY
        location.id ASC, price ASC
Run Code Online (Sandbox Code Playgroud)

这将仅为每个选择第一行location.id.

由于您的行排序location.id,然后通过price,这将是具有最小代价的行.

在new中PostgreSQL 8.4,您还可以使用窗口函数:

SELECT  *
FROM    (
        SELECT  thing.*, ROW_NUMBER() OVER (PARTITION BY location_id ORDER BY price) AS rn
        FROM    location
        JOIN    thing
        ON      thing.location_id = location_id
        WHERE   type = 1
        ) q
WHERE   rn = 1
Run Code Online (Sandbox Code Playgroud)