Re: Iterate and write a previous row to a temp table?
От | Richard Huxton |
---|---|
Тема | Re: Iterate and write a previous row to a temp table? |
Дата | |
Msg-id | 468A9C10.8070005@archonet.com обсуждение исходный текст |
Ответ на | Iterate and write a previous row to a temp table? (Bob Singleton <bsingleton@ibss.net>) |
Список | pgsql-sql |
Bob Singleton wrote: > Revisiting a Time In Status query I received help on - I'm trying to > narrow down a subset of data I return for analysis. > > Given a statusLog as entityId, statusId, timestamp that might look > something like > > entityId | statusId | timestamp > -------------------------------------------- > 001 | HLD | 2007-06-14 11:07:35.93 > 001 | RDY | 2007-06-15 11:07:35.93 > 001 | USE | 2007-06-16 11:07:35.93 > 001 | RDY | 2007-06-17 11:07:35.93 > 001 | MNT | 2007-06-18 11:07:35.93 > > I need to pull for a given span of time - say 2007-06-16 00:00:00.01 > (let me call it startTime) to 2007-06-17 23:59:59.99 (call it endTime) > in such a way that rows with a timestamp between startTime and endTime > AND the latest record prior to or equal to startTime are returned. In > the above simplified example, only the second and third rows would be > returned. Can't be done, because you don't have a primary key, so no way to distinguish between duplicate rows. However, if you just eliminate duplicates you could just use a function like (not tested): CREATE FUNCTION ranged(startTime timestamp with time zone,endTime timestamp with time zone, ) RETURNS SETOF statusLog AS $$ SELECT entityid,statusid,timestamp FROM statusLog WHERE timestamp BETWEEN startTimeAND endTime UNION SELECT entityid,statusid,timestamp FROM statusLog WHERE timestamp <= startTime ORDER BY timestamp DESC LIMIT 1 ORDER BY <final result ordering> $$ LANGUAGE SQL; Note that UNION eliminates duplicates, if you want to keep them use "UNION ALL" HTH -- Richard Huxton Archonet Ltd
В списке pgsql-sql по дате отправления: