Re: [sqlite] Status analyze with Sqlite
Your expected result does not make any logical algorithmic sense whatsoever. --- () ascii ribbon campaign against html e-mail /\ www.asciiribbon.org > -Original Message- > From: sqlite-users-boun...@sqlite.org [mailto:sqlite-users- > boun...@sqlite.org] On Behalf Of Steffen Mangold > Sent: Friday, 23 November, 2012 02:02 > To: General Discussion of SQLite Database > Subject: Re: [sqlite] Status analyze with Sqlite > > > > > ID | TimeStamp | Status > > > > 0 | 2012-07-24 22:23:00 | status1 > > 1 | 2012-07-24 22:23:05 | status1 > > 2 | 2012-07-24 22:23:10 | status2 > > 3 | 2012-07-24 22:23:16 | status2 > > 4 | 2012-07-24 22:23:21 | status2 > > 5 | 2012-07-24 22:23:26 | status2 > > 6 | 2012-07-24 22:23:32 | status2 > > 7 | 2012-07-24 22:23:37 | status3 > > 8 | 2012-07-24 22:23:42 | status3 > > 9 | 2012-07-24 22:23:47 | status3 > > > > What I want as result is > > ID | Begin | End | Status > > --- > > > 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 > > 1 | 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 > > 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 > > > > > > > Hmmm, the ID in the result bears virtually no relation to the ID in the > data. Is that intentional? > > > > Anyhow, some of what you want could come from > > > > select min(TimeStamp) as Begin, max(TimeStamp) as End, Status from Data > group by Status order by Status > > > > Hi Gerry, > > thank you but this won't work if the table look like this: > > ID | TimeStamp | Status > > 0| 2012-07-24 22:23:00 | status1 > 1| 2012-07-24 22:23:05 | status1 > 2| 2012-07-24 22:23:10 | status2 > 3| 2012-07-24 22:23:16 | status2 > 4| 2012-07-24 22:23:21 | status1 > 5| 2012-07-24 22:23:26 | status1 > 6| 2012-07-24 22:23:32 | status2 > 7| 2012-07-24 22:23:37 | status3 > 8| 2012-07-24 22:23:42 | status3 > 9| 2012-07-24 22:23:47 | status3 > > Than you get: > ID | Begin | End | Status > > --- > 0| 2012-07-24 22:23:00 | 2012-07-24 22:23:26 | status1 > 1| 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 > 2| 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 > > But it should be: > ID| Begin | End | Status > > --- > 0| 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 > 0| 2012-07-24 22:23:10 | 2012-07-24 22:23:16 | status2 > 1| 2012-07-24 22:23:21 | 2012-07-24 22:23:26 | status1 > 2| 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 > > You are right the ID column is not relevant. You can ignore them. > > regards > Steffen Mangold ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Status analyze with Sqlite
On 23 Nov 2012, at 9:01am, Steffen Mangoldwrote: > But it should be: > ID| Begin | End | Status > --- > 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 > 0 | 2012-07-24 22:23:10 | 2012-07-24 22:23:16 | status2 > 1 | 2012-07-24 22:23:21 | 2012-07-24 22:23:26 | status1 > 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 You can find the 'Begin's by, for every line, looking up the previous line with a sub-SELECT and checking to see whether it has the same status. Then you do the 'Ends' by looking up the following line. Might have some trouble with the first and last lines in the table. It would be a horribly complicated SQL command. However, do you absolutely have to do this inside a SQL command ? It's trivial in any programming language but puts a great load on a SQL engine. In code you only have to read every row once, in an order already provided by an INDEX. If you do it in SQL you also have to do at least one look-up for every row, keyed on a long string. Simon. ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Status analyze with Sqlite
Steffen Mangold wrote: > TimeStamp | Status > - > 2012-07-24 22:23:00 | status1 > 2012-07-24 22:23:05 | status1 > 2012-07-24 22:23:10 | status2 > 2012-07-24 22:23:16 | status2 > 2012-07-24 22:23:21 | status1 > 2012-07-24 22:23:26 | status1 > 2012-07-24 22:23:32 | status2 > 2012-07-24 22:23:37 | status3 > 2012-07-24 22:23:42 | status3 > 2012-07-24 22:23:47 | status3 > > This is what I want: > > Begin | End | Status > --- > 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 > 2012-07-24 22:23:10 | 2012-07-24 22:23:16 | status2 > 2012-07-24 22:23:21 | 2012-07-24 22:23:26 | status1 > 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 And what about the event at 22:23:32? Regards, Clemens ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Status analyze with Sqlite
Hi Clemens, first thank you for your comments. > > It works for what you've asked. Perhaps you should not have kept your actual > requirements a secret. > Sorry for being unclear! :( Hope my English is understandable (I'm from Germany). > > So you want to group only consecutive events with identical statuses, where > "consecutive" is defined on the ordering of the timestamps? > > Then why do you write them? (And why are there duplicates in your last > example?) > You are right I only want consecutive events of same status. Here more a clear example. This is the table: TimeStamp | Status - 2012-07-24 22:23:00 | status1 2012-07-24 22:23:05 | status1 2012-07-24 22:23:10 | status2 2012-07-24 22:23:16 | status2 2012-07-24 22:23:21 | status1 2012-07-24 22:23:26 | status1 2012-07-24 22:23:32 | status2 2012-07-24 22:23:37 | status3 2012-07-24 22:23:42 | status3 2012-07-24 22:23:47 | status3 This is what I want: Begin | End | Status --- 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 2012-07-24 22:23:10 | 2012-07-24 22:23:16 | status2 2012-07-24 22:23:21 | 2012-07-24 22:23:26 | status1 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 > > Well, try this: > > SELECT TimeStamp AS Begin, >(SELECT MAX(TimeStamp) > FROM Data AS same > WHERE same.Status = ou.Status > AND same.TimeStamp >= ou.TimeStamp > AND same.TimeStamp < (COALESCE((SELECT MIN(TimeStamp) > FROM Data AS next > WHERE next.TimeStamp > ou.TimeStamp > AND next.Status <> ou.Status), > '')) >) AS End, >Status > FROM Data AS ou > WHERE Status IS NOT (SELECT Status > FROM (SELECT Status, > MAX(prev.TimeStamp) >FROM Data AS prev > WHERE prev.TimeStamp < ou.TimeStamp)) > Thank you I try this. > > (And it might be easier and faster to just query the events ordered by > timestamp, and aggregate statuses by hand in your code.) > Hm ok I make some test. I think you can be right that in-code aggregation is faster that subquerys. Regards, Steffen ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Status analyze with Sqlite
Steffen Mangold wrote: > this won't work It works for what you've asked. Perhaps you should not have kept your actual requirements a secret. > if the table look like this: > > ID | TimeStamp | Status > > 0| 2012-07-24 22:23:00 | status1 > 1| 2012-07-24 22:23:05 | status1 > 2| 2012-07-24 22:23:10 | status2 > 3| 2012-07-24 22:23:16 | status2 > 4| 2012-07-24 22:23:21 | status1 > 5| 2012-07-24 22:23:26 | status1 > 6| 2012-07-24 22:23:32 | status2 > 7| 2012-07-24 22:23:37 | status3 > 8| 2012-07-24 22:23:42 | status3 > 9| 2012-07-24 22:23:47 | status3 > > Than you get: > ID | Begin | End | Status > > --- > 0| 2012-07-24 22:23:00 | 2012-07-24 22:23:26 | status1 > 1| 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 > 2| 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 > > But it should be: > ID| Begin | End | Status > > --- > 0| 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 > 0| 2012-07-24 22:23:10 | 2012-07-24 22:23:16 | status2 > 1| 2012-07-24 22:23:21 | 2012-07-24 22:23:26 | status1 > 2| 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 So you want to group only consecutive events with identical statuses, where "consecutive" is defined on the ordering of the timestamps? > You are right the ID column is not relevant. You can ignore them. Then why do you write them? (And why are there duplicates in your last example?) Well, try this: SELECT TimeStamp AS Begin, (SELECT MAX(TimeStamp) FROM Data AS same WHERE same.Status = ou.Status AND same.TimeStamp >= ou.TimeStamp AND same.TimeStamp < (COALESCE((SELECT MIN(TimeStamp) FROM Data AS next WHERE next.TimeStamp > ou.TimeStamp AND next.Status <> ou.Status), '')) ) AS End, Status FROM Data AS ou WHERE Status IS NOT (SELECT Status FROM (SELECT Status, MAX(prev.TimeStamp) FROM Data AS prev WHERE prev.TimeStamp < ou.TimeStamp)) (And it might be easier and faster to just query the events ordered by timestamp, and aggregate statuses by hand in your code.) Regards, Clemens ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Status analyze with Sqlite
> ID| TimeStamp | Status > > 0 | 2012-07-24 22:23:00 | status1 > 1 | 2012-07-24 22:23:05 | status1 > 2 | 2012-07-24 22:23:10 | status2 > 3 | 2012-07-24 22:23:16 | status2 > 4 | 2012-07-24 22:23:21 | status2 > 5 | 2012-07-24 22:23:26 | status2 > 6 | 2012-07-24 22:23:32 | status2 > 7 | 2012-07-24 22:23:37 | status3 > 8 | 2012-07-24 22:23:42 | status3 > 9 | 2012-07-24 22:23:47 | status3 > > What I want as result is > ID| Begin | End | Status > --- > 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 > 1 | 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 > 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 > > > Hmmm, the ID in the result bears virtually no relation to the ID in the data. > Is that intentional? > > Anyhow, some of what you want could come from > > select min(TimeStamp) as Begin, max(TimeStamp) as End, Status from Data group > by Status order by Status > Hi Gerry, thank you but this won't work if the table look like this: ID | TimeStamp | Status 0 | 2012-07-24 22:23:00 | status1 1 | 2012-07-24 22:23:05 | status1 2 | 2012-07-24 22:23:10 | status2 3 | 2012-07-24 22:23:16 | status2 4 | 2012-07-24 22:23:21 | status1 5 | 2012-07-24 22:23:26 | status1 6 | 2012-07-24 22:23:32 | status2 7 | 2012-07-24 22:23:37 | status3 8 | 2012-07-24 22:23:42 | status3 9 | 2012-07-24 22:23:47 | status3 Than you get: ID | Begin | End | Status --- 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:26 | status1 1 | 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 But it should be: ID | Begin | End | Status --- 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 0 | 2012-07-24 22:23:10 | 2012-07-24 22:23:16 | status2 1 | 2012-07-24 22:23:21 | 2012-07-24 22:23:26 | status1 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 You are right the ID column is not relevant. You can ignore them. regards Steffen Mangold ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
Re: [sqlite] Status analyze with Sqlite
On 11/22/2012 4:47 PM, Steffen Mangold wrote: HI sqlite community, I have a problem I get stucked, maybe someone can help me. :( My issue: For instance if we have 10 rows with following data ID | TimeStamp | Status 0 | 2012-07-24 22:23:00 | status1 1 | 2012-07-24 22:23:05 | status1 2 | 2012-07-24 22:23:10 | status2 3 | 2012-07-24 22:23:16 | status2 4 | 2012-07-24 22:23:21 | status2 5 | 2012-07-24 22:23:26 | status2 6 | 2012-07-24 22:23:32 | status2 7 | 2012-07-24 22:23:37 | status3 8 | 2012-07-24 22:23:42 | status3 9 | 2012-07-24 22:23:47 | status3 What I want as result is ID | Begin | End | Status --- 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 1 | 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 Hmmm, the ID in the result bears virtually no relation to the ID in the data. Is that intentional? Anyhow, some of what you want could come from select min(TimeStamp) as Begin, max(TimeStamp) as End, Status from Data group by Status order by Status HTH, Gerry ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
[sqlite] Status analyze with Sqlite
HI sqlite community, I have a problem I get stucked, maybe someone can help me. :( My issue: For instance if we have 10 rows with following data ID | TimeStamp | Status 0 | 2012-07-24 22:23:00 | status1 1 | 2012-07-24 22:23:05 | status1 2 | 2012-07-24 22:23:10 | status2 3 | 2012-07-24 22:23:16 | status2 4 | 2012-07-24 22:23:21 | status2 5 | 2012-07-24 22:23:26 | status2 6 | 2012-07-24 22:23:32 | status2 7 | 2012-07-24 22:23:37 | status3 8 | 2012-07-24 22:23:42 | status3 9 | 2012-07-24 22:23:47 | status3 What I want as result is ID | Begin | End | Status --- 0 | 2012-07-24 22:23:00 | 2012-07-24 22:23:05 | status1 1 | 2012-07-24 22:23:10 | 2012-07-24 22:23:32 | status2 2 | 2012-07-24 22:23:37 | 2012-07-24 22:23:47 | status3 What I have so far is SELECT ou. ID AS ID, ou.Status AS Status, ou.TimeStamp AS Begin, (SELECT MAX(TimeStamp) FROM Data WHERE TimeStamp >= ou.TimeStamp AND Status = ou.Status AND TimeStamp < '2010-02-24 00:00:00') AS End FROM Data ou But don't work :( Can you please help me? Regards Steffen Mangold ___ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users