Problem ze stworzeniem automatu do rozbudowanego zapytania

Problem ze stworzeniem automatu do rozbudowanego zapytania
K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Cześć mam taki problem
mam zapytanie które jest gigantyczne ze względu na to że treść skryptu powtarza się kilkanaście razy i każde powtórzenie jest przesunięte interwałem o 3 miesiące. Chciałabym zrobić z tego np. pętle aby każde przesunięcie odkładało się w nowej kolumnie. Skrypt zmienia się dość cyklicznie i kilkunastokrotne wklejanie go od nowa jest czasochłonne
Czy ktoś poratuję pomysłem jak to zrobić?

Kopiuj
select distinct grupa::numeric,
sum(round(greatest(least(
(case when poli_data_od::date>poli_data_do::date then 0
else
          (poli_data_do::date - (to_date(numer_okresu||'01','yyyymmdd') + interval '1 months'- interval '1 day')::date)::numeric
                 /greatest(poli_data_do::date-poli_data_od::date+1,1)::numeric
        end)
,1),0) 
* przypisanie,2)) as now,
sum(round(greatest(least(
(case when poli_data_od::date>poli_data_do::date then 0
else
          (poli_data_do::date - (to_date(numer_okresu||'01','yyyymmdd') + interval '4 months'- interval '1 day')::date)::numeric
                 /greatest(poli_data_do::date-poli_data_od::date+1,1)::numeric
        end)
,1),0) 
* przypisanie,2)) as now_and_1q
from tabelka
where numer_okresu='202409'
group by grupa;


AC
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 83
0

Siemka,

Mogą być dwie opcje - jedna to funkcja okienkowa, druga to blok.

Nie wiem czy dokładnie zrozumiałem, ale mógłbyś zrobić blok po prostu w miejscu DECLARE użyć zmiennych INTERVAL. Potem otwierasz pętle, która przechodzi w tym stylu:

Kopiuj
DECLARE

  INTERVALS INT := ARRAY[1,4,7,10,12] - zgodnie z interwałami kwartalnymi 
  INTERVAL INT 
  sql_query TEXT := 'SELECT GRUPA::numeric';
  
  BEGIN
  FOREACH INTERVAL IN ARRAY INTERVALS 
  LOOP
   sql_query := sql_query || sum(round
Tutaj dajesz swoją logikę z CASE w stylu poli_data_od > data 

  END LOOP 

 sql_query := sql_query || E - tutaj dajesz swoją tabelke i warunkujesz po WHERE i GROUP BY 

 EXECUTE sql_query 

 END 

Coś takiego jak powyżej, nie jestem w stanie Ci super pomóc bo z postgre trochę nie do końca ogarniam składni, ale na tyle co tam pamiętam to logika byłaby taka jak powyżej

Zastanów się tylko czy nie osiągniesz tego samego robiąc okno:
Zrobisz na początek

Kopiuj
WITH nazwa1 ( 
SELECT generate_series(1, 12, 3) - tutaj masz zakres 1 do 12, przesunięte co 3 
),
nazwa2 (dane czy coś) AS (
grupa,
numeric
numer okrs
przesuniecie
wszystkie kolmny które potrzebujesz,
round(greatest(least(,
CASE twój
FROM TABELKA 
CROSS JOIN nazwa1 
WHERE NUMER OKRESU = '202409'
)
SELECT grupa, przesuniecie, SUM(tutaj rezultat jako wynik)
FROM nazwa2
ORDER 
GROUP BY

Mam tylko nadzieje, że Ci bardziej nie zasywiłem głowy i jest to w miare zrozumiałe

K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2
0

Dzięki spróbuję to ogarnąć na rzeczywistych danych.
Jak widzę oba pomysły są ciekawe.
Dam znać czy któryś z pomysłów dał oczekiwany efekt

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.