Taksis Ierakstīts Janvāris 29, 2018 Share Ierakstīts Janvāris 29, 2018 Sveicināti! Ir process, kurš MS SQL tabulā EVENTS raksta notikumus (līdzīgi ka "event log") YYYYMMDDHHMMSS formātā. Piemēram: IF OBJECT_ID('events', 'U') IS NOT NULL DROP TABLE events; CREATE TABLE events ( event_sequence_number INT NOT NULL IDENTITY(1,1) PRIMARY KEY, event_timestamp float ); GO insert into events (event_timestamp) values (20180108121314), (20180108131415) , (20180108131516), (20180108151617) select * from events event_sequence_number event_timestamp 1 20180108121314 2 20180108131415 3 20180108131516 4 20180108151617 Kādā veidā noteikt tos divus ierakstus starp kuriem ir vislielākais intervāls? Šinī piemērā tie ir ieraksti #3 un #4. Starpība - 20101 sekundes. Piemēram SQL 2014 to atrod ar pieprasījumu: SELECT event_sequence_number, event_timestamp, Lead(event_timestamp, 1) OVER(ORDER BY event_timestamp) AS next_event_timestamp, Lead(event_timestamp, 1) OVER(ORDER BY event_timestamp) - event_timestamp AS diff FROM events ORDER by diff DESC; event_sequence_number event_timestamp next_event_timestamp diff 3 20180108131516 20180108151617 20101 1 20180108121314 20180108131415 10101 2 20180108131415 20180108131516 101 4 20180108151617 NULL NULL Kā to atrast bez "Lead" funkcijas? Paldies. Link to comment Share on other sites More sharing options...
Ronalds Janvāris 29, 2018 Share Janvāris 29, 2018 Ar storēto proceduru. Bet tas būs ilgi. Vai arī tabulai + lauks diff un trigeris uz inserta kas izrēķina starpību ar iepriekšējo ierakstu. Bet tad tabulu nedrīkst labot. Link to comment Share on other sites More sharing options...
Ronalds Janvāris 29, 2018 Share Janvāris 29, 2018 Bet! https://mariadb.com/kb/en/library/window-functions-overview/ MariaDB kas ir uzlabots MySQL forks ir window funkcijas. Link to comment Share on other sites More sharing options...
basic Janvāris 29, 2018 Share Janvāris 29, 2018 pirms 2 stundām , Ronalds teica: MariaDB kas ir uzlabots MySQL Taksim vajadzēja MS SQL Ja sequence_number iet pēc kārtas, derēs šis skripts: SELECT *, ev.event_timestamp-evn.event_timestamp as diff FROM events ev INNER JOIN events evn ON ev.event_sequence_number=evn.event_sequence_number+1 ORDER BY diff desc ja ne, tad jānumurē pašam ar ROW_NUMBER() funkciju subselektā. Link to comment Share on other sites More sharing options...
Ronalds Janvāris 30, 2018 Share Janvāris 30, 2018 pirms 15 stundām , Taksis teica: kurš MS SQL Jā sajaucu.... BET!!! pirms 15 stundām , Taksis teica: Piemēram SQL 2014 Vai tad tas nav MS SQL????? Tāpēc jau arī sajaucu... Link to comment Share on other sites More sharing options...
Taksis Janvāris 30, 2018 Author Share Janvāris 30, 2018 pirms 7 stundām , basic teica: SELECT *, ev.event_timestamp-evn.event_timestamp as diff FROM events ev INNER JOIN events evn ON ev.event_sequence_number=evn.event_sequence_number+1 ORDER BY diff desc Paldies. Interesants risinājums. Nezināju, ka tabulu ar alias var referencēt pašu uz sevi. Diemžēl nav garantijas, ka sequence_number iet pēc kārtas. Paldies par ideju ar ROW_NUMBER(). Papētīšu kā to izdarīt. Link to comment Share on other sites More sharing options...
Recommended Posts
Izveido kontu, vai pieraksties esošajā, lai komentētu
Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas
Izveidot jaunu kontu
Piereģistrējies un izveido jaunu kontu, tas būs viegli!
Reģistrēt jaunu kontuPierakstīties
Jums jau ir konts? Pierakstieties tajā šeit!
Pierakstīties tagad!