2017-01-15 7 views
0

列の値(updated_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_list_idを持つすべてのレコードは、そのweightは同じ値に更新されます。私はすべてのweight値が異なるとランクに依存すると期待しています。
サブクエリだけを実行すると、正しい結果が得られます(各レコードのランクが異なります)。しかし、更新は期待どおりには機能しません。
変更する必要はありますか?

+0

あなたは 'バイヤーの'(のみ関連する列の構造を投稿することができます)といくつかのサンプルデータ? – joanolo

+1

'' updated_at ''の引用符を削除します。 – klin

答えて

1

あなたの質問には非常に微妙な誤りがあります。代わりにこれを試してみてください:

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 ; 

あなたのlitle間違い:ORDER BY 'updated_at'はちょうどORDER BY 'constant-text'です。列を参照する場合は、"updated_at"二重の引用符)またはupdated_at(列の名前はASCIIの小文字だけなので)を使用します。

で試してみました

:(RETURNING *句を使用して)前のUPDATEの結果は次のようになり

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') ; 

|----+---------------+---------------------+--------+----+------+-------| 
| 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 | 
|----+---------------+---------------------+--------+----+------+-------| 
+0

ありがとうございました! – leemour

関連する問題