2017-01-15 7 views
0

열의 값 (updated_at)을 기반으로 각 레코드의 가중치를 계산하려고합니다. 나는 다음과 같은 쿼리를 실행하면 : 같은 board_list_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 

모든 기록 얻을 자신의 weight 같은 값으로 업데이트되었습니다. 모든 weight 값이 달라지고 순위에 따라 달라질 것으로 기대합니다.
하위 쿼리 만 실행하면 정확한 결과가 생성됩니다 (각 레코드의 순위가 다릅니다). 그러나 업데이트가 예상대로 작동하지 않습니다.
무엇을 변경해야합니까?

+0

것은 당신이 buyers''의 구조 (만 해당 열을 게시 할 수) 및 일부 샘플 데이터? – 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 ; 

귀하의 저 작은 실수 : ORDER BY 'updated_at' 그냥 ORDER BY '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') ; 

(복귀 * 절이있는) 이전 UPDATE의 결과는 다음과 같습니다 :

함께 시도

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