Filtrowanie i odrzucenie najbliższych elementów

0

Załóżmy, że mam rekordy w bazie w takiej postaci:

  1. Wartość: 99 Timestamp: 2020-12-10 2000

  2. Wartość: 100 Timestamp: 2020-12-10 1950

  3. Wartość: 44 Timestamp: 2020-12-10 1800

  4. Wartość: 36 Timestamp: 2020-12-10 1750

I ostatecznie po odfiltorwaniu chciałbym w mojej wynikowej liście mieć jedynie rekordy nr 1 i 3 - czyli z danego podzbioru wziąć jedynie najnowszy rekord a resztę odrzucić. Można założyć, że dane należą do różnych podzbiorów jeżeli wartość ich timestamp różni się o ponad godzinę. Jest jakiś algorytm jak to najwydajniej wykonać?

1

Którą z kombinacji chciałbyś otrzymać dla takiego zbioru?

id=1, timestamp=12:00:00
id=2, timestamp=12:30:01
id=3, timestamp=13:00:02
id=4, timestamp=13:30:03
id=5, timestamp=14:00:04

Warianty, które dostrzegam:

  • (1, 3) (1+2 jako pierwsza grupa, 3+4 jako druga)
  • (1, 3, 5) (1+2 jako pierwsza grupa, 3+4 jako druga, 5 samo w sobie jako trzecia)
  • (2, 4) (2+3 jako pierwsza grupa, 4+5 jako druga)
  • (1, 2, 4) (1 samo w sobie, 2+3 jako druga grupa, 4+5 jako trzecia)
0

Hmm takiego zbioru akurat miał nie będę ponieważ rekordy wpadają co kilka sekund, później jest przerwa około 1h i znowu wpadają co kilka sekund, czyli zbiór danych na którym wygląda tak jak ten który podałem w pierwszym poście. I potrzebuję oddzielić od siebie rekordy te które wpadały od tych które wpadały godzinę później.

0

Zakładając DB, które nie wspiera MATCH_RECOGNIZE to trzeba się posiłkować window functions - https://modern-sql.com/feature/match_recognize. Alternatywnie możesz zrobić debounce na wejściu. Rozwiązań jest parę i ciężko coś powiedzieć bez większej ilości informacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1