Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

best way to split up a long file. Programming or SQL?

I have a database Table (in MS-Access) of GPS information with a record of Speed, location (lat/long) and bearing of a vehicle for every second. There is a field that shows time like this 2007-09-25 07:59:53. The problem is that this table has has merged information from several files that were collected on this project. So, for example, 2007-09-25 07:59:53 to 2007-09-25 08:15:42 could be one file and after a gap of more than 10 seconds, the next file will start, like 2007-09-25 08:15:53 to 2007-09-25 08:22:12. I need to populate a File number field in this table and the separating criterion for each file will be that the gap in time from the last and next file is more than 10 sec. I did this using C# code by iterating over the table and comparing each record to the next and changing file number whenever the gap is more than 10 sec.

My question is, should this type of problem be solved using programming or is it better solved using a SQL query? I can load the data into a database like SQL Server, so there is no limitation to what tool I can use. I just want to know the best approach.

If it is better to solve this using SQL, will I need to use cursors?

When solving this using programming (for example C#) what is an efficient way to update a Table when 20000+ records need to be updated based on an updated DataSet? I used the DataAdapter.Update() method and it seemed to take a long time to update the table (30 mins or so).

like image 974
Traffic_Engineer Avatar asked Nov 14 '22 16:11

Traffic_Engineer


1 Answers

Assuming SQL Server 2008 and CTEs from your comments:

The best time to use SQL is generally when you are comparing or evaluating large sets of data.

Iterative programming languages like C# are better suited to more expansive analysis of individual records or analysis of rows one at a time (*R*ow *B*y *A*gonizing *R*ow).

For examples of recursive CTEs, see here. MS has a good reference.

Also, depending on data structure, you could do this with a normal JOIN:

SELECT <stuff>
FROM MyTable T
INNER JOIN MyTable T2
    ON t2.timefield = DATEADD(minute, -10, t.timefield)
WHERE t2.pk = (SELECT MIN(pk) FROM MyTable WHERE pk > t.pk)
like image 179
JNK Avatar answered Dec 06 '22 17:12

JNK