De benodigde SQL hiervoor is brutaal; het geeft je optimizer een behoorlijk serieuze training.
Afgaande op de opmerkingen na de vraag en de vraag, is het de wens om reeksen gebeurtenissen voor een gegeven gebruikers-ID in de grote tabel als 'aaneengesloten' te behandelen als ze allemaal binnen een vast interval tussen aangrenzende gebeurtenissen vallen. Het vaste interval is bijvoorbeeld 3 uur. Ik codeer voor IBM Informix Dynamic Server (voor de duidelijkheid, versie 11.70, maar 11.50 zou ook prima werken). Dit betekent dat er een idiosyncratische notatie is die ik moet uitleggen. In het bijzonder de notatie 3 UNITS HOUR
geeft een interval van 3 uur aan; het kan ook worden geschreven INTERVAL(3) HOUR TO HOUR
in het Informix-dialect van SQL, of als INTERVAL '3' HOUR
in standaard SQL.
Er zijn een aantal cruciale technieken bij het genereren van SQL, met name complexe SQL. Een daarvan is om de SQL stapsgewijs op te bouwen, stukje bij beetje, om het uiteindelijke resultaat samen te stellen. De andere is ervoor te zorgen dat u een duidelijke specificatie heeft van wat u zoekt.
In de volgende notatie moet de kwalificatie 'voor dezelfde User_ID' worden beschouwd als altijd onderdeel van de uitdrukking.
In de grote tafel zijn er drie categorieën van bereik die we willen overwegen voordat we ons aansluiten bij de kleine tafel.
- Inzendingen waarbij er geen rij is met een gebeurtenistijd vóór de gebeurtenis die dichtbij genoeg is, noch een rij met een gebeurtenistijd na de gebeurtenis die dichtbij genoeg is. Dit is een tijdsperiode met dezelfde begin- en eindtijd.
- Een paar vermeldingen in de tabel die zelf dichtbij genoeg zijn, maar waarvoor geen gebeurtenis eerder is dan de vroege gebeurtenis van het paar die dichtbij genoeg is, noch een gebeurtenis later dan de late gebeurtenis van het paar dat dichtbij genoeg is noch een gebeurtenis tussen het paar.
- Een reeks van drie of meer items in de tabel waarvoor er is:
- Geen gebeurtenis E1 eerder dan de vroegste die dichtbij genoeg is
- Geen evenement E2 later dan de laatste die dichtbij genoeg is
- Een evenement E3 later dan de vroegste die dicht genoeg bij de vroegste ligt
- Een gebeurtenis E4 eerder dan de laatste die dicht genoeg bij de laatste ligt (E4 kan mogelijk dezelfde gebeurtenis zijn als E3)
- Geen paar gebeurtenissen E5, E6 tussen de vroegste en de laatste waarbij er geen gebeurtenis is tussen E5 en E6, maar de kloof tussen E5 en E6 is te groot om te tellen.
Zoals je aan de beschrijving kunt zien, wordt dit een enge SQL!
NB:De code is nu getest; enkele (voornamelijk kleine) wijzigingen waren nodig. Een kleine onnodige wijziging was de toevoeging van ORDER BY-clausules op tussenliggende zoekopdrachten. Een andere onnodige wijziging was het selecteren van de andere gegevens uit de kleine tabel voor verificatiedoeleinden. Deze revisie is gemaakt zonder de gewijzigde versie te bestuderen die is gepost door msh210 .
Merk ook op dat ik verre van zeker ben dat dit een minimale formulering is; het kan mogelijk zijn om alle bereiken te classificeren met een enkele SELECT-instructie in plaats van een UNION van drie SELECT-instructies (en het zou goed zijn als dat het geval is).
Singleton-bereiken
-- Ranges of exactly 1 event
SELECT lt1.user_id, lt1.event_time AS min_time, lt1.event_time AS max_time
FROM Large_Table AS lt1
WHERE NOT EXISTS -- an earlier event that is close enough
(SELECT *
FROM Large_Table AS lt3
WHERE lt1.user_id = lt3.user_id
AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
AND lt3.event_time < lt1.event_time
)
AND NOT EXISTS -- a later event that is close enough
(SELECT *
FROM Large_Table AS lt4
WHERE lt1.user_id = lt4.user_id
AND lt4.event_time > lt1.event_time
AND lt4.event_time < lt1.event_time + 3 UNITS HOUR
)
ORDER BY User_ID, Min_Time;
Doubleton-bereiken
-- Ranges of exactly 2 events
SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
FROM Large_Table AS lt1
JOIN Large_Table AS lt2
ON lt1.user_id = lt2.user_id
AND lt1.event_time < lt2.event_time
AND lt2.event_time < lt1.event_time + 3 UNITS HOUR
WHERE NOT EXISTS -- an earlier event that is close enough
(SELECT *
FROM Large_Table AS lt3
WHERE lt1.user_id = lt3.user_id
AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
AND lt3.event_time < lt1.event_time
)
AND NOT EXISTS -- a later event that is close enough
(SELECT *
FROM Large_Table AS lt4
WHERE lt1.user_id = lt4.user_id
AND lt4.event_time > lt2.event_time
AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
)
AND NOT EXISTS -- any event in between
(SELECT *
FROM Large_Table AS lt5
WHERE lt1.user_id = lt5.user_id
AND lt5.event_time > lt1.event_time
AND lt5.event_time < lt2.event_time
)
ORDER BY User_ID, Min_Time;
criterium van 3 uur toegevoegd aan buitenste WHERE-clausule.
Meerdere gebeurtenisbereiken
-- Ranges of 3 or more events
SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
FROM Large_Table AS lt1
JOIN Large_Table AS lt2
ON lt1.user_id = lt2.user_id
AND lt1.event_time < lt2.event_time
WHERE NOT EXISTS -- an earlier event that is close enough
(SELECT *
FROM Large_Table AS lt3
WHERE lt1.user_id = lt3.user_id
AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
AND lt3.event_time < lt1.event_time
)
AND NOT EXISTS -- a later event that is close enough
(SELECT *
FROM Large_Table AS lt4
WHERE lt1.user_id = lt4.user_id
AND lt4.event_time > lt2.event_time
AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
)
AND NOT EXISTS -- a gap that's too big in the events between first and last
(SELECT *
FROM Large_Table AS lt5 -- E5 before E6
JOIN Large_Table AS lt6
ON lt5.user_id = lt6.user_id
AND lt5.event_time < lt6.event_time
WHERE lt1.user_id = lt5.user_id
AND lt6.event_time < lt2.event_time
AND lt5.event_time > lt1.event_time
AND (lt6.event_time - lt5.event_time) > 3 UNITS HOUR
AND NOT EXISTS -- an event in between these two
(SELECT *
FROM Large_Table AS lt9
WHERE lt5.user_id = lt9.user_id
AND lt9.event_time > lt5.event_time
AND lt9.event_time < lt6.event_time
)
)
AND EXISTS -- an event close enough after the start
(SELECT *
FROM Large_Table AS lt7
WHERE lt1.user_id = lt7.user_id
AND lt1.event_time < lt7.event_time
AND lt7.event_time < lt1.event_time + 3 UNITS HOUR
AND lt7.event_time < lt2.event_time
)
AND EXISTS -- an event close enough before the end
(SELECT *
FROM Large_Table AS lt8
WHERE lt2.user_id = lt8.user_id
AND lt2.event_time > lt8.event_time
AND lt8.event_time > lt2.event_time - 3 UNITS HOUR
AND lt8.event_time > lt1.event_time
)
ORDER BY User_ID, Min_Time;
Omitted geneste NOT EXISTS-clausule toegevoegd in de subquery 'big gaps'.
Alle reeksen in grote tabel
Het is duidelijk dat de volledige lijst met bereiken in de laatste tabel de vereniging is van de drie bovenstaande zoekopdrachten.
Query verwijderd als niet interessant genoeg. Het is gewoon de 3-way UNION van de afzonderlijke zoekopdrachten hierboven.
Laatste zoekopdracht
De laatste zoekopdracht vindt de eventuele bereiken in het resultaat van de gruwelijke 3-delige UNION die dicht genoeg bij het item in de kleine tabel ligt. Een enkele vermelding in de kleine tafel kan bijvoorbeeld om 13:00 uur vallen, en er kan een bereik zijn in de grote tafel die om 11:00 uur eindigt en een andere die om 15:00 uur begint. De twee bereiken van de grote tafel zijn gescheiden (de tussenruimte is 4 uur), maar de invoer in de kleine tafel is dicht genoeg bij beide om te tellen. [De tests hebben betrekking op deze zaak. ]
SELECT S.User_id, S.Event_Time, L.Min_Time, L.Max_Time, S.Other_Data
FROM Small_Table AS S
JOIN (
-- Ranges of exactly 1 event
SELECT lt1.user_id, lt1.event_time AS min_time, lt1.event_time AS max_time
FROM Large_Table AS lt1
WHERE NOT EXISTS -- an earlier event that is close enough
(SELECT *
FROM Large_Table AS lt3
WHERE lt1.user_id = lt3.user_id
AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
AND lt3.event_time < lt1.event_time
)
AND NOT EXISTS -- a later event that is close enough
(SELECT *
FROM Large_Table AS lt4
WHERE lt1.user_id = lt4.user_id
AND lt4.event_time > lt1.event_time
AND lt4.event_time < lt1.event_time + 3 UNITS HOUR
)
UNION
-- Ranges of exactly 2 events
SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
FROM Large_Table AS lt1
JOIN Large_Table AS lt2
ON lt1.user_id = lt2.user_id
AND lt1.event_time < lt2.event_time
AND lt2.event_time < lt1.event_time + 3 UNITS HOUR
WHERE NOT EXISTS -- an earlier event that is close enough
(SELECT *
FROM Large_Table AS lt3
WHERE lt1.user_id = lt3.user_id
AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
AND lt3.event_time < lt1.event_time
)
AND NOT EXISTS -- a later event that is close enough
(SELECT *
FROM Large_Table AS lt4
WHERE lt1.user_id = lt4.user_id
AND lt4.event_time > lt2.event_time
AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
)
AND NOT EXISTS -- any event in between
(SELECT *
FROM Large_Table AS lt5
WHERE lt1.user_id = lt5.user_id
AND lt5.event_time > lt1.event_time
AND lt5.event_time < lt2.event_time
)
UNION
-- Ranges of 3 or more events
SELECT lt1.user_id, lt1.event_time AS min_time, lt2.event_time AS max_time
FROM Large_Table AS lt1
JOIN Large_Table AS lt2
ON lt1.user_id = lt2.user_id
AND lt1.event_time < lt2.event_time
WHERE NOT EXISTS -- an earlier event that is close enough
(SELECT *
FROM Large_Table AS lt3
WHERE lt1.user_id = lt3.user_id
AND lt3.event_time > lt1.event_time - 3 UNITS HOUR
AND lt3.event_time < lt1.event_time
)
AND NOT EXISTS -- a later event that is close enough
(SELECT *
FROM Large_Table AS lt4
WHERE lt1.user_id = lt4.user_id
AND lt4.event_time > lt2.event_time
AND lt4.event_time < lt2.event_time + 3 UNITS HOUR
)
AND NOT EXISTS -- a gap that's too big in the events between first and last
(SELECT *
FROM Large_Table AS lt5 -- E5 before E6
JOIN Large_Table AS lt6
ON lt5.user_id = lt6.user_id
AND lt5.event_time < lt6.event_time
WHERE lt1.user_id = lt5.user_id
AND lt6.event_time < lt2.event_time
AND lt5.event_time > lt1.event_time
AND (lt6.event_time - lt5.event_time) > 3 UNITS HOUR
AND NOT EXISTS -- an event in between these two
(SELECT *
FROM Large_Table AS lt9
WHERE lt5.user_id = lt9.user_id
AND lt9.event_time > lt5.event_time
AND lt9.event_time < lt6.event_time
)
)
AND EXISTS -- an event close enough after the start
(SELECT *
FROM Large_Table AS lt7
WHERE lt1.user_id = lt7.user_id
AND lt1.event_time < lt7.event_time
AND lt7.event_time < lt1.event_time + 3 UNITS HOUR
AND lt7.event_time < lt2.event_time
)
AND EXISTS -- an event close enough before the end
(SELECT *
FROM Large_Table AS lt8
WHERE lt2.user_id = lt8.user_id
AND lt2.event_time > lt8.event_time
AND lt8.event_time > lt2.event_time - 3 UNITS HOUR
AND lt8.event_time > lt1.event_time
)
) AS L
ON S.User_ID = L.User_ID
WHERE S.Event_Time > L.Min_Time - 3 UNITS HOUR
AND S.Event_Time < L.Max_Time + 3 UNITS HOUR
ORDER BY User_ID, Event_Time, Min_Time;
OK - terechte waarschuwing; de SQL is eigenlijk nergens in de buurt van een SQL DBMS geweest.
De code is nu getest. De oneindig kleine kans was eigenlijk nul; er was een syntaxisfout en een paar min of meer kleine problemen moesten worden opgelost.
Na het bedenken van de testgegevens heb ik stapsgewijs geëxperimenteerd. Ik heb de 'Alfa'-gegevens (zie hieronder) gebruikt tijdens het valideren en corrigeren van de zoekopdrachten, en heb de bètagegevens alleen toegevoegd om ervoor te zorgen dat er geen overspraak was tussen verschillende User_ID-waarden.
Ik gebruikte expliciete <
en >
bewerkingen in plaats van BETWEEN ... AND
om de eindpunten uit te sluiten; als je wilt dat gebeurtenissen precies 3 uur uit elkaar liggen om als 'dicht genoeg' te tellen, dan moet je elke ongelijkheid beoordelen, eventueel veranderen in BETWEEN ... AND
of mogelijk gewoon met behulp van >=
of <=
indien van toepassing.
Er is een antwoord op een min of meer vergelijkbare maar vrij eenvoudigere vraag die (a) ik schreef en (b) enkele nuttige gedachten gaf over de complexe verwerking hierboven (met name de criteria 'geen gebeurtenis eerder maar dichtbij genoeg' en 'geen gebeurtenis later maar dichtbij genoeg' De criteria 'dicht genoeg bij' maken deze vraag zeker ingewikkelder.
Testgegevens
Grote tafel
CREATE TABLE Large_Table
(
Event_Time DATETIME YEAR TO MINUTE NOT NULL,
User_ID CHAR(15) NOT NULL,
Other_Data INTEGER NOT NULL,
PRIMARY KEY(User_ID, Event_Time)
);
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 09:15', 'Alpha', 1) { R4 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 11:15', 'Alpha', 2) { R4 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 13:15', 'Alpha', 3) { R4 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 15:15', 'Alpha', 4) { R4 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 12:17', 'Beta', 1) { R4 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 09:15', 'Alpha', 5) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 10:17', 'Beta', 2) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 09:15', 'Alpha', 6) { R2 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 11:15', 'Alpha', 7) { R2 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 10:17', 'Beta', 3) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 09:15', 'Alpha', 8) { R3 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 11:15', 'Alpha', 9) { R3 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 13:15', 'Alpha', 10) { R3 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 10:17', 'Beta', 4) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 09:15', 'Alpha', 11) { R2 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 11:15', 'Alpha', 12) { R2 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 10:17', 'Beta', 5) { R1 };
{ Probe here }
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 15:15', 'Alpha', 13) { R2 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 17:15', 'Alpha', 14) { R2 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 16:17', 'Beta', 6) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 09:15', 'Alpha', 15) { R6 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 11:15', 'Alpha', 16) { R6 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 13:15', 'Alpha', 17) { R6 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 15:15', 'Alpha', 18) { R6 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 17:15', 'Alpha', 19) { R6 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 19:15', 'Alpha', 20) { R6 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 16:17', 'Beta', 7) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 09:15', 'Alpha', 21) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 11:17', 'Beta', 8) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 12:15', 'Alpha', 22) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 13:17', 'Beta', 9) { R1 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 09:15', 'Alpha', 23) { R5 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 11:15', 'Alpha', 24) { R5 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 13:15', 'Alpha', 25) { R5 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 15:15', 'Alpha', 26) { R5 };
INSERT INTO Large_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 17:15', 'Alpha', 27) { R5 };
Kleine tafel
Let op:voor testdoeleinden bevat de kleine tabel eigenlijk meer rijen dan de grote tabel. De rijen in de kleine tabel met Other_Data-waarden groter dan 100 zouden niet in de resultaten moeten verschijnen (en ook niet). De tests hier prikken aan de randvoorwaarden.
CREATE TABLE Small_Table
(
Event_Time DATETIME YEAR TO MINUTE NOT NULL,
User_ID CHAR(15) NOT NULL,
Other_Data INTEGER NOT NULL,
PRIMARY KEY(User_ID, Event_Time)
);
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 06:15', 'Alpha', 131) { XX };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 06:20', 'Alpha', 31) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 10:20', 'Alpha', 32) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 13:20', 'Alpha', 33) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 15:20', 'Alpha', 34) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 18:15', 'Alpha', 134) { XX };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 06:15', 'Alpha', 135) { XX };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 06:16', 'Alpha', 35) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 10:20', 'Alpha', 35) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 12:14', 'Alpha', 35) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 12:15', 'Alpha', 135) { XX };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 09:20', 'Alpha', 36) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 11:20', 'Alpha', 37) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 09:20', 'Alpha', 38) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 11:20', 'Alpha', 39) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 13:20', 'Alpha', 40) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 09:20', 'Alpha', 41) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 11:20', 'Alpha', 42) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 13:20', 'Alpha', 42) { 22 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 15:20', 'Alpha', 43) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 17:20', 'Alpha', 44) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 09:20', 'Alpha', 45) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 11:20', 'Alpha', 46) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 13:20', 'Alpha', 47) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 15:20', 'Alpha', 48) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 17:20', 'Alpha', 49) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 19:20', 'Alpha', 50) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 09:20', 'Alpha', 51) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 10:20', 'Alpha', 51) { 22 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 12:20', 'Alpha', 52) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 09:20', 'Alpha', 53) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 11:20', 'Alpha', 54) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 13:20', 'Alpha', 55) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 15:20', 'Alpha', 56) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-08 17:20', 'Alpha', 57) { YY };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 13:27', 'Beta', 9) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-07 11:27', 'Beta', 8) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-06 16:27', 'Beta', 7) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 16:27', 'Beta', 6) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-05 10:27', 'Beta', 5) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-04 10:27', 'Beta', 4) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-03 10:27', 'Beta', 3) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-02 10:27', 'Beta', 2) { R1 };
INSERT INTO Small_Table(Event_Time, User_ID, Other_Data) VALUES('2012-01-01 12:27', 'Beta', 1) { R4 };
Laatste zoekopdrachtresultaten
Met behulp van de bovenstaande gegevens waren de verkregen resultaten:
Alpha 2012-01-01 06:20 2012-01-01 09:15 2012-01-01 15:15 31
Alpha 2012-01-01 10:20 2012-01-01 09:15 2012-01-01 15:15 32
Alpha 2012-01-01 13:20 2012-01-01 09:15 2012-01-01 15:15 33
Alpha 2012-01-01 15:20 2012-01-01 09:15 2012-01-01 15:15 34
Alpha 2012-01-02 06:16 2012-01-02 09:15 2012-01-02 09:15 35
Alpha 2012-01-02 10:20 2012-01-02 09:15 2012-01-02 09:15 35
Alpha 2012-01-02 12:14 2012-01-02 09:15 2012-01-02 09:15 35
Alpha 2012-01-03 09:20 2012-01-03 09:15 2012-01-03 11:15 36
Alpha 2012-01-03 11:20 2012-01-03 09:15 2012-01-03 11:15 37
Alpha 2012-01-04 09:20 2012-01-04 09:15 2012-01-04 13:15 38
Alpha 2012-01-04 11:20 2012-01-04 09:15 2012-01-04 13:15 39
Alpha 2012-01-04 13:20 2012-01-04 09:15 2012-01-04 13:15 40
Alpha 2012-01-05 09:20 2012-01-05 09:15 2012-01-05 11:15 41
Alpha 2012-01-05 11:20 2012-01-05 09:15 2012-01-05 11:15 42
Alpha 2012-01-05 13:20 2012-01-05 09:15 2012-01-05 11:15 42
Alpha 2012-01-05 13:20 2012-01-05 15:15 2012-01-05 17:15 42
Alpha 2012-01-05 15:20 2012-01-05 15:15 2012-01-05 17:15 43
Alpha 2012-01-05 17:20 2012-01-05 15:15 2012-01-05 17:15 44
Alpha 2012-01-06 09:20 2012-01-06 09:15 2012-01-06 19:15 45
Alpha 2012-01-06 11:20 2012-01-06 09:15 2012-01-06 19:15 46
Alpha 2012-01-06 13:20 2012-01-06 09:15 2012-01-06 19:15 47
Alpha 2012-01-06 15:20 2012-01-06 09:15 2012-01-06 19:15 48
Alpha 2012-01-06 17:20 2012-01-06 09:15 2012-01-06 19:15 49
Alpha 2012-01-06 19:20 2012-01-06 09:15 2012-01-06 19:15 50
Alpha 2012-01-07 09:20 2012-01-07 09:15 2012-01-07 09:15 51
Alpha 2012-01-07 09:20 2012-01-07 12:15 2012-01-07 12:15 51
Alpha 2012-01-07 10:20 2012-01-07 09:15 2012-01-07 09:15 51
Alpha 2012-01-07 10:20 2012-01-07 12:15 2012-01-07 12:15 51
Alpha 2012-01-07 12:20 2012-01-07 12:15 2012-01-07 12:15 52
Alpha 2012-01-08 09:20 2012-01-08 09:15 2012-01-08 17:15 53
Alpha 2012-01-08 11:20 2012-01-08 09:15 2012-01-08 17:15 54
Alpha 2012-01-08 13:20 2012-01-08 09:15 2012-01-08 17:15 55
Alpha 2012-01-08 15:20 2012-01-08 09:15 2012-01-08 17:15 56
Alpha 2012-01-08 17:20 2012-01-08 09:15 2012-01-08 17:15 57
Beta 2012-01-01 12:27 2012-01-01 12:17 2012-01-01 12:17 1
Beta 2012-01-02 10:27 2012-01-02 10:17 2012-01-02 10:17 2
Beta 2012-01-03 10:27 2012-01-03 10:17 2012-01-03 10:17 3
Beta 2012-01-04 10:27 2012-01-04 10:17 2012-01-04 10:17 4
Beta 2012-01-05 10:27 2012-01-05 10:17 2012-01-05 10:17 5
Beta 2012-01-05 16:27 2012-01-05 16:17 2012-01-05 16:17 6
Beta 2012-01-06 16:27 2012-01-06 16:17 2012-01-06 16:17 7
Beta 2012-01-07 11:27 2012-01-07 11:17 2012-01-07 13:17 8
Beta 2012-01-07 13:27 2012-01-07 11:17 2012-01-07 13:17 9
Tussenresultaten
Iets andere opmaak van kracht.
Singleton-reeksen
Alpha|2012-01-02 09:15|2012-01-02 09:15
Alpha|2012-01-07 09:15|2012-01-07 09:15
Alpha|2012-01-07 12:15|2012-01-07 12:15
Beta|2012-01-01 12:17|2012-01-01 12:17
Beta|2012-01-02 10:17|2012-01-02 10:17
Beta|2012-01-03 10:17|2012-01-03 10:17
Beta|2012-01-04 10:17|2012-01-04 10:17
Beta|2012-01-05 10:17|2012-01-05 10:17
Beta|2012-01-05 16:17|2012-01-05 16:17
Beta|2012-01-06 16:17|2012-01-06 16:17
Doubleton-reeksen
Alpha|2012-01-03 09:15|2012-01-03 11:15
Alpha|2012-01-05 09:15|2012-01-05 11:15
Alpha|2012-01-05 15:15|2012-01-05 17:15
Beta|2012-01-07 11:17|2012-01-07 13:17
Meerdere gebeurtenisbereiken
Alpha|2012-01-01 09:15|2012-01-01 15:15
Alpha|2012-01-04 09:15|2012-01-04 13:15
Alpha|2012-01-06 09:15|2012-01-06 19:15
Alpha|2012-01-08 09:15|2012-01-08 17:15