Обсуждение: Query question

Поиск
Список
Период
Сортировка

Query question

От
Stéphane RIFF
Дата:
Hi ,

I have table that represent a switch activity like this :

|         date                    | state  |
| 2005-04-20 17:00:00 |   0     |
| 2005-04-20 17:00:15 |   0     |
| 2005-04-20 17:00:30 |   1     |
| 2005-04-20 17:00:45 |   1     |
| 2005-04-20 17:01:00 |   1     |
| 2005-04-20 17:01:15 |   0     |
| 2005-04-20 17:01:30 |   0     |
| 2005-04-20 17:01:45 |   0     |

I want to get the date of each states change but i not a sql expert.
Can someone advices me

Thanks



Re: Query question

От
Franco Bruno Borghesi
Дата:
If you have a row every 15 seconds, the answer is quite easy: <br /><pre>SELECTA1.date
FROMactivity A1LEFT JOIN activity A2 ON (A2.date=A1.date-'15 secs'::interval)
WHEREA1.state<>A2.state OR A2.state IS NULL
ORDER BY 1
</pre><br /><br /> Now if you don't have a row every 15 seconds, the answer is a bit more complex (at least I couldn't
thinkof an easier solution): <br /><br /><pre>SELECTmin(TMP2.new_date)
 
FROM(    SELECT        DISTINCT        TMP.new_date,        max(TMP.old_date) AS max_old_date    FROM        (
 SELECT                    A1.id AS new_id, A1.date AS new_date, A1.state AS new_state,                A2.id AS old_id,
A2.dateAS old_date, A2.state AS old_state            FROM                activity A1                LEFT JOIN activity
A2ON (A2.date<A1.date)            ORDER BY                A1.date, A2.date DESC            ) AS TMP    WHERE
TMP.old_state<>TMP.new_stateOR TMP.old_state IS NULL    GROUP BY        TMP.new_date) TMP2
 
GROUP BYTMP2.max_old_date
ORDER BY 1
</pre><br /> I've tested both queries on postgreSQL 8 with the data you provided, and they both work. Anyway try them
withlarger datasets before using them in real life <span class="moz-smiley-s3"><span> ;-) </span></span><br /><br />
Hopeit helps.<br /><br /><br /> Stéphane RIFF wrote: <blockquote cite="mid42667F3C.6080303@cerene.fr" type="cite">Hi ,
<br/><br /> I have table that represent a switch activity like this : <br /><br /> |         date                    |
state | <br /> | 2005-04-20 17:00:00 |   0     | <br /> | 2005-04-20 17:00:15 |   0     | <br /> | 2005-04-20 17:00:30
|  1     | <br /> | 2005-04-20 17:00:45 |   1     | <br /> | 2005-04-20 17:01:00 |   1     | <br /> | 2005-04-20
17:01:15|   0     | <br /> | 2005-04-20 17:01:30 |   0     | <br /> | 2005-04-20 17:01:45 |   0     | <br /><br /> I
wantto get the date of each states change but i not a sql expert. <br /> Can someone advices me <br /><br /> Thanks <br
/><br/><br /> ---------------------------(end of broadcast)--------------------------- <br /> TIP 7: don't forget to
increaseyour free space map settings <br /><br /></blockquote><br /> 

Re: Query question

От
Stéphane RIFF
Дата:
I do some tests with your first query and it seems to works.
Thanks a lot for your answer, i will post the final thought later
Thanks again
bye

Franco Bruno Borghesi wrote:

> If you have a row every 15 seconds, the answer is quite easy:
>
>SELECT
>    A1.date
>FROM
>    activity A1
>    LEFT JOIN activity A2 ON (A2.date=A1.date-'15 secs'::interval)
>WHERE
>    A1.state<>A2.state OR A2.state IS NULL
>ORDER BY 1
>  
>
>
>
> Now if you don't have a row every 15 seconds, the answer is a bit more 
> complex (at least I couldn't think of an easier solution):
>
>SELECT
>    min(TMP2.new_date)
>FROM
>    (
>        SELECT
>            DISTINCT
>            TMP.new_date,
>            max(TMP.old_date) AS max_old_date
>        FROM
>            (
>                SELECT    
>                    A1.id AS new_id, A1.date AS new_date, A1.state AS new_state,
>                    A2.id AS old_id, A2.date AS old_date, A2.state AS old_state
>                FROM
>                    activity A1
>                    LEFT JOIN activity A2 ON (A2.date<A1.date)
>                ORDER BY
>                    A1.date, A2.date DESC    
>            ) AS TMP
>        WHERE
>            TMP.old_state<>TMP.new_state OR TMP.old_state IS NULL
>        GROUP BY
>            TMP.new_date
>    ) TMP2
>GROUP BY
>    TMP2.max_old_date
>ORDER BY 1
>  
>
>
> I've tested both queries on postgreSQL 8 with the data you provided, 
> and they both work. Anyway try them with larger datasets before using 
> them in real life ;-)
>
> Hope it helps.
>
>
> Stéphane RIFF wrote:
>
>> Hi ,
>>
>> I have table that represent a switch activity like this :
>>
>> |         date                    | state  |
>> | 2005-04-20 17:00:00 |   0     |
>> | 2005-04-20 17:00:15 |   0     |
>> | 2005-04-20 17:00:30 |   1     |
>> | 2005-04-20 17:00:45 |   1     |
>> | 2005-04-20 17:01:00 |   1     |
>> | 2005-04-20 17:01:15 |   0     |
>> | 2005-04-20 17:01:30 |   0     |
>> | 2005-04-20 17:01:45 |   0     |
>>
>> I want to get the date of each states change but i not a sql expert.
>> Can someone advices me
>>
>> Thanks
>>
>>
>> ---------------------------(end of broadcast)---------------------------
>> TIP 7: don't forget to increase your free space map settings
>>
>
>------------------------------------------------------------------------
>
>No virus found in this incoming message.
>Checked by AVG Anti-Virus.
>Version: 7.0.308 / Virus Database: 266.10.1 - Release Date: 20/04/2005
>  
>