Postgresql 使用子查询更新为所有记录设置相同的值
我试图根据一列的值来计算每条记录的权重(Postgresql 使用子查询更新为所有记录设置相同的值,postgresql,postgresql-9.5,Postgresql,Postgresql 9.5,我试图根据一列的值来计算每条记录的权重(updated\u at)。当我运行以下查询时: UPDATE buyers SET weight = RankedRecords.rank / (RankedRecords.count + 1.0) FROM ( SELECT id, RANK() OVER ( PARTITION BY board_list_id ORDER BY 'updated_at' ASC ) AS rank, COUNT(i
updated\u at
)。当我运行以下查询时:
UPDATE buyers
SET weight = RankedRecords.rank / (RankedRecords.count + 1.0)
FROM (
SELECT
id,
RANK() OVER (
PARTITION BY board_list_id ORDER BY 'updated_at' ASC
) AS rank,
COUNT(id) OVER (PARTITION BY board_list_id) AS count
FROM buyers
) RankedRecords
WHERE buyers.id = RankedRecords.id
具有相同board\u list\u id的所有记录将其权重更新为相同值。而我希望所有的权重值都是不同的,并且取决于等级。
只运行子查询会产生正确的结果(每条记录具有不同的排名)。但是更新没有按预期工作。
我应该更改什么?您的查询中有一个非常微妙的错误。请尝试以下方法:
UPDATE
buyers
SET
weight = RankedRecords.rank / (RankedRecords.count + 1.0)
FROM
(
SELECT
id,
rank() OVER (PARTITION BY board_list_id ORDER BY updated_at ASC) AS rank,
count(id) OVER (PARTITION BY board_list_id) AS count
FROM buyers
) RankedRecords
WHERE
buyers.id = RankedRecords.id ;
您的小错误:orderby'updated_at'
只是orderby'constant text'
。如果要引用该列,可以使用“updated_at”
(带双引号)或updated_at
(没有它们,因为列的名称只是ASCII小写字符)
试用:
CREATE TABLE buyers
(
id integer not null primary key,
board_list_id integer not null,
updated_at timestamp not null default now(),
weight double precision
) ;
INSERT INTO buyers (id, board_list_id, updated_at)
VALUES
(1, 1, '2017-01-09'),
(2, 1, '2017-01-10'),
(3, 1, '2017-01-11'),
(4, 1, '2017-01-12'),
(5, 2, '2017-01-09'),
(6, 2, '2017-01-10'),
(7, 2, '2017-01-11'),
(8, 1, '2017-01-12') ;
上一次更新(带有RETURNING*子句)的结果将是:
|----+---------------+---------------------+--------+----+------+-------|
| id | board_list_id | updated_at | weight | id | rank | count |
|----+---------------+---------------------+--------+----+------+-------|
| 1 | 1 | 2017-01-09 00:00:00 | 0.1667 | 1 | 1 | 5 |
|----+---------------+---------------------+--------+----+------+-------|
| 2 | 1 | 2017-01-10 00:00:00 | 0.3333 | 2 | 2 | 5 |
|----+---------------+---------------------+--------+----+------+-------|
| 3 | 1 | 2017-01-11 00:00:00 | 0.5 | 3 | 3 | 5 |
|----+---------------+---------------------+--------+----+------+-------|
| 8 | 1 | 2017-01-12 00:00:00 | 0.6667 | 8 | 4 | 5 |
|----+---------------+---------------------+--------+----+------+-------|
| 4 | 1 | 2017-01-12 00:00:00 | 0.6667 | 4 | 4 | 5 |
|----+---------------+---------------------+--------+----+------+-------|
| 5 | 2 | 2017-01-09 00:00:00 | 0.25 | 5 | 1 | 3 |
|----+---------------+---------------------+--------+----+------+-------|
| 6 | 2 | 2017-01-10 00:00:00 | 0.5 | 6 | 2 | 3 |
|----+---------------+---------------------+--------+----+------+-------|
| 7 | 2 | 2017-01-11 00:00:00 | 0.75 | 7 | 3 | 3 |
|----+---------------+---------------------+--------+----+------+-------|
您能否发布买家的结构(仅相关列)和一些示例数据?删除'updated\u at'
中的引号。