W PostgreSQL 9.4 funkcje okna mają nową opcję FILTER
do wyboru podzbioru ramki okna do przetwarzania. Dokumentacja wspomina o tym, ale nie dostarcza próbki. Wyszukiwanie online dostarcza niektórych próbek, w tym z 2ndQuadrant, ale wszystkie znalezione przykłady są dość trywialne i mają stałe wyrażenia. To, czego szukam, to wyrażenie filtru, które zawiera wartość bieżącego wiersza.Odwoływanie się do bieżącego wiersza w klauzuli FILTER o funkcji okna
Załóżmy Mam tabeli z wieloma kolumnami, z których jeden jest date
typu:
col1 | col2 | dt ------------------------ 1 | a | 2015-07-01 2 | b | 2015-07-03 3 | c | 2015-07-10 4 | d | 2015-07-11 5 | e | 2015-07-11 6 | f | 2015-07-13 ...
definicja okno do przetwarzania na date
na całej tabeli jest trywialnie skonstruowanej: WINDOW win AS (ORDER BY dt)
Interesuje mnie wiedzieć, ile wierszy jest obecnych w, powiedzmy, 4 dni przed bieżącym wierszem (włącznie). Więc chcę wygenerować ten wynik:
col1 | col2 | dt | count -------------------------------- 1 | a | 2015-07-01 | 1 2 | b | 2015-07-03 | 2 3 | c | 2015-07-10 | 1 4 | d | 2015-07-11 | 3 5 | e | 2015-07-11 | 3 6 | f | 2015-07-13 | 4 ...
FILTER
klauzula funkcji okna wydaje się oczywistym wyborem:
count(*) FILTER (WHERE current_row.dt - dt <= 4) OVER win
Ale jak mogę określić current_row.dt
(dla braku lepszego składni)? Czy to możliwe?
Jeśli nie jest to możliwe, czy istnieją inne sposoby wybierania zakresów date
w ramce okna? Specyfikacja ramek nie jest pomocna, ponieważ jest ona oparta na wierszach.
Nie interesują mnie alternatywne rozwiązania z wykorzystaniem pod-zapytań, musi to być oparte na przetwarzaniu okien.
Interesujący problem. Jako regularny Postgres powinieneś wiedzieć, aby podać definicję tabeli (lub jeszcze lepiej, kompletny skrypt "STWÓRZ TABELĘ"). –
@ErwinBrandstetter Czy jest to coś, co zasługuje na oflagowanie jako "żądanie funkcji"? Dla mnie wydaje się bardzo cenne, aby móc filtrować ramę okna na podstawie pewnych warunków obecnych w bieżącym wierszu. – Patrick
Tak, przydałoby się to w przypadku różnych problemów, widziałem tutaj kilka powiązanych pytań na stronie SO. Obawiam się, że funkcja wymagałaby dużo pracy z powodu głównych zmian w implementacji, ale nie zaszkodzi udokumentować zainteresowanie publiczne tą funkcją. Wygląda na to, że brakuje funkcji 'RANGE MIĘDZY ... PRECEDING/FOLLOWING', która już jest [udokumentowana w Wiki ToDo] (https://wiki.postgresql.org/wiki/Todo#Window_Functions) –