From: | CN <cnliou9(at)fastmail(dot)fm> |
---|---|
To: | pgsql-sql(at)postgresql(dot)org |
Subject: | Display group title only at the first record within each group |
Date: | 2016-08-23 16:13:35 |
Message-ID: | 1471968815.2343352.703756417.6A1C9C13@webmail.messagingengine.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
Hi!
Such layout is commonly seen on real world reports where duplicated
group titles are discarded except for the first one.
CREATE TABLE x(name TEXT,dt DATE,amount INTEGER);
COPY x FROM stdin;
john 2016-8-20 80
mary 2016-8-17 20
john 2016-7-8 30
john 2016-8-19 40
mary 2016-8-17 30
john 2016-7-8 50
\.
My desired result follows:
john 2016-07-08 50
30
2016-08-19 40
2016-08-20 80
mary 2016-08-17 20
30
Note that "dt" is sorted as if clause
ORDER BY name,dt
was applied to SELECT.
With this SELECT:
SELECT name
,ROW_NUMBER() OVER (PARTITION BY name) AS rn_name
,dt
,ROW_NUMBER() OVER (PARTITION BY name,dt) AS rn_dt
,amount
FROM x;
I get this result:
john 2 2016-07-08 1 30
john 4 2016-07-08 2 50
john 3 2016-08-19 1 40
john 1 2016-08-20 1 80
mary 1 2016-08-17 1 20
mary 2 2016-08-17 2 30
Above result shows that records are not sorted by rn_name and rn_dt.
Were the above records correctly sorted "BY rn_name,rn_dt", the
following SELECT probably would fulfill my ultimate goal:
SELECT
CASE WHEN rn_name=1 THEN name ELSE NULL END
,CASE WHEN rn_dt=1 THEN dt ELSE NULL END
,amount
FROM (
SELECT name
,ROW_NUMBER() OVER (PARTITION BY name) AS rn_name
,dt
,ROW_NUMBER() OVER (PARTITION BY name,dt) AS rn_dt
,amount
FROM x
) t
Would someone please give me a hand?
Best Regards,
CN
--
http://www.fastmail.com - IMAP accessible web-mail
From | Date | Subject | |
---|---|---|---|
Next Message | Harald Fuchs | 2016-08-24 08:03:27 | Re: Display group title only at the first record within each group |
Previous Message | Tom Lane | 2016-08-21 00:09:56 | Re: Autoincrement value in a SELECT statement |