From: | "Thomas F(dot) O'Connell" <tfo(at)sitening(dot)com> |
---|---|
To: | PgSQL - SQL <pgsql-sql(at)postgresql(dot)org> |
Subject: | Grouping Too Closely |
Date: | 2005-06-23 19:16:36 |
Message-ID: | BBA34C36-E1D7-4166-A47F-BA0D563C48B9@sitening.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
I have a table that looks like this:
CREATE TABLE my_table (
pkey serial PRIMARY KEY,
fkey int NOT NULL REFERENCES my_other_table( pkey ),
uid int NOT NULL REFERENCES user( pkey ),
seq1 int,
seq2 int
);
Basically, for each fkey that exists in my_table, there is a sequence
represented by seq1, which covers every record corresponding to a
given fkey. Then there is a subset of records covered by seq2, which
increments over the course of a given fkey, but might span multiple
records.
E.g.,
pkey | fkey | uid | seq1 | seq2
---------------------------------------
1 | 1 | 1 | 1 | 1
2 | 1 | 2 | 2 | 1
...
What I'd like to be able to do is select all records corresponding to
the minimum value of seq1 for each value of seq2 corresponding to a
given fkey (with a lower bound on the value of seq2).
My first attempt looked like this:
SELECT fkey, uid, seq2
FROM my_table
WHERE seq2 > 2
GROUP BY fkey, seq2, uid, seq1
HAVING seq1 = min( seq1 )
but this groups too closely to return the desired results.
My next attempt looked like this (where I use the shorthand for min
in the subquery):
SELECT fkey, uid, seq2
FROM my_table AS mt1
WHERE mt1.seq2 > 2
AND ( mt1.uid, hh1.seq1 ) IN (
SELECT mt2.player_id, mt2.order_no
FROM my_table AS mt2
WHERE mt2.fkey = mt1.fkey
AND mt2.seq2 = mt1.seq2
GROUP BY mt2.seq1, mt2.uid
ORDER BY mt2.seq1 ASC
LIMIT 1
)
GROUP BY mt1.holdem_game_id, mt1.holdem_round_type_id, mt1.player_id
This seems like it works, but it is abominably slow, running on the
order of days across 1.5 million rows rather than the seconds (or
preferably milliseconds) I'd prefer.
I have this annoying feeling that I'm overlooking a reasonably
efficient in-between query.
--
Thomas F. O'Connell
Co-Founder, Information Architect
Sitening, LLC
Strategic Open Source: Open Your i™
http://www.sitening.com/
110 30th Avenue North, Suite 6
Nashville, TN 37203-6320
615-260-0005
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2005-06-23 19:28:50 | Re: optimizer, view, union |
Previous Message | Markus Bertheau | 2005-06-23 17:31:57 | optimizer, view, union |