From: | Thom Brown <thom(at)linux(dot)com> |
---|---|
To: | LALIT KUMAR <lalit(dot)jss(at)gmail(dot)com> |
Cc: | pgsql-novice(at)postgresql(dot)org |
Subject: | Re: Compare rows |
Date: | 2011-07-13 10:00:05 |
Message-ID: | CAA-aLv5naEwXz6m9GqrUL32z+D7VGGjpUthiVCex3oyMTFLxDQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-novice |
On 13 July 2011 07:15, LALIT KUMAR <lalit(dot)jss(at)gmail(dot)com> wrote:
> Hi,
> I have the following table.
> city Rate flag
> A 10 0
> A 20 1
> A 30 0
> A 2 0
> A 23 1
> A 12 0
> B 5 1
> B 43 0
> C 23 1
> C 67 1
> For every city I have so set the flag as -1 in row which is 0 above the row
> having flag as 1.
> So my out would be:
> city Rate flag
> A 10 -1
> A 20 1
> A 30 0
> A 2 -1
> A 23 1 (not changed to -1 as it not 0)
> A 12 0 (not changed to -1 because i need to compare
> it to row of same city. so being last row not compared with any row)
> ----------------------------------------------------
> B 5 1
> B 43
> C 23 1
> C 67 1
You could try this:
UPDATE
my_table
SET
flag = -1
FROM (
SELECT
city, dat, lead(flag, 1, 0) OVER (PARTITION BY city ORDER BY
dat) AS next_flag
FROM
my_table
) t2
WHERE
my_table.city = t2.city
AND
my_table.dat = t2.dat
AND
flag = 0
AND
next_flag = 1
This joins the target table with a subquery that uses a window
function to work out what the next value of the date column is, and
updates based on that.
--
Thom Brown
Twitter: @darkixion
IRC (freenode): dark_ixion
Registered Linux user: #516935
EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company
From | Date | Subject | |
---|---|---|---|
Next Message | dev ss | 2011-07-15 19:58:09 | Datetime stored in bigint |
Previous Message | Oliveiros d'Azevedo Cristina | 2011-07-13 09:50:34 | Re: Compare rows |