Mam zapytanie SQL, gdzie muszę dynamicznie zapewnić trzy rzeczy:

  • weekly_ads powinien mieć aktualny numer tygodnia. Ponieważ w tym tygodniu jest 43, więc powinien mieć - 'WEEKLY#2020#43%'
  • month powinien być bieżący numer miesiąca, a {X1}} powinien mieć wszystkie dni na bieżący tydzień począwszy od niedzieli do soboty.
  • all_weeks powinien mieć wszystkie tygodnie, ale rozpoczynający się numer tygodnia musi być pierwszy z końcówki 6 tygodni. Co oznacza, że powinien być taki ('38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '1') na tydzień 43 i na tydzień 44, znów usuniemy 38 z przodu.

Od teraz wszystko jest dyskowane, jak pokazano poniżej:

...
where weekly_ads like 'WEEKLY#2020#41%'
and (month = '10' and dates_for_week IN  ('11', '12', '13', '14', '15', '16', '17'))
and all_weeks IN ('37','38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '1')

Chciałem zrobić to zapytanie dynamiczne, aby nie musiałem ręcznie wypełnić tych numerów za każdym razem, gdy biegam moje powyżej zapytanie. Czy to możliwe, aby zrobić to przez jakąś szansę?

Wiem, że mogę uzyskać aktualny numer tygodnia w ten sposób - DATE_PART(w, CURRENT_DATE), ale mylić, jak umieścić to w mojej linii {x1}}. Próbowałem poniżej, ale jestem pewien, że jest źle.

...
where weekly_ads like 'WEEKLY#2020#DATE_PART(w, CURRENT_DATE)%'
and (month = DATE_PART(m, CURRENT_DATE) and dates_for_week IN  ('11', '12', '13', '14', '15', '16', '17'))
and all_weeks IN ('37','38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '1')
1
AndyP 20 październik 2020, 19:12

1 odpowiedź

Najlepsza odpowiedź

Myślę, że to powinno być coś takiego

Uwaga: Niektóre zmiany i poprawki typu danych mogą być wymagane z powodu typów danych

select *
from table

where weekly_ads like concat(concat(concat(concat('WEEKLY#', extract(year from current_date)), '#'), extract(week from current_date)), '%')
  and (
        month = extract(month from current_date)
        and dates_for_week IN (
                select
                    date_part('d',((DATE_TRUNC('week', CURRENT_DATE) - 1) + row_number() over (order by true))::date)
                from any_table
                limit 7
      )
  )
  and all_weeks IN (
      (
        select week_number
        from (
             select extract(week from (DATE_TRUNC('week', current_date) - 7 * row_number() over (order by true))::date) week_number
             from any_table limit 6
         ) as w
        order by week_number
        )

        union all

        (
            select week_number
            from (
             select extract(week from (DATE_TRUNC('week', current_date) + 7 * (row_number() over (order by true) - 1))::date) week_number
             from any_table
             limit 11
         ) as w2)
order by week_number)

AKTUALIZACJA

Pierwsza część

concat(concat(concat(concat('WEEKLY#', extract(year from current_date)), '#'), extract(week from current_date)), '%')

Jest tylko łańcuchem konkatenacji z ekstrakcją części dat, które spowoduje 'WEEKLY#2020#43%'

Następna część jest wybrana z dowolnej tabeli w bazie danych, która ma wystarczająco dużo wierszy

select 
  date_part('d',((DATE_TRUNC('week', CURRENT_DATE) - 1) + row_number() over (order by true))::date)
from any_table
limit 7

Tutaj używamy Funkcja okna {x0}} Aby utworzyć sekwencję liczb od 1 do N = liczba wierszy w tabeli, której używamy. W naszym przypadku n = 7, ponieważ musimy uzyskać daty 1 tygodnia, a zatem używamy tutaj LIMIT 7. Używamy tej sekwencji, aby uzyskać listę dat przy użyciu (DATE_TRUNC('week', CURRENT_DATE) - 1), co daje nam w niedzielę i operator {X3}}, który po prostu dodaje N dni do tej daty. Po tym wyodrębniamy Data części z date_part('d', date)

Spowoduje to

dates
----
18
19
20
21
22
23
24
25

Które możemy użyć do filtrowania dates_for_week ( może być konieczne wykonywanie odlewu typu danych, aby uzyskać pracę ze swoimi danymi. Nie mam możliwości testowania dokładnych zapytania na moje środowisko )

Ta sama zasada, której używamy z ostatnią częścią, w której używamy funkcji okna row_number() over (order by true) ponownie i zrób trochę matematyki, aby utworzyć sekwencje liczb, które pozwolą nam wygenerować poprawne daty, z których możemy uzyskać numery tygodniowe. Ponadto musimy utworzyć 2 stoły tutaj i {x1}} je, ponieważ sekwencje są skierowane w różnych kierunkach - jeden z dzisiejszego tygodnia do przeszłości z limitem 6 tygodni, a drugi od dzisiaj do przyszłości (nie dałem " t dostać się z pytania Liczba tygodni, które musisz tutaj ograniczyć, więc umieściłem 11)

week_number
-----
38
39
40
41
...
51
52
53

W tym tygodniu_Number możemy użyć do filtrowania all_weeks.

1
Pavel Slepiankou 22 październik 2020, 05:30