cubes:
- name: calendar_454
public: false
sql: |
WITH RECURSIVE fiscal_weeks AS (
-- Step 1: Define the start of the fiscal years (Sunday closest to Feb 1st)
SELECT
year AS fiscal_year,
CASE
WHEN strftime('%w', date_trunc('week', make_date(year, 2, 1)))::INTEGER <= 3
THEN date_trunc('week', make_date(year, 2, 1)) + INTERVAL 6 DAY
ELSE date_trunc('week', make_date(year, 2, 1) + INTERVAL 7 DAY) + INTERVAL 7 DAY
END AS week_start,
1 AS week_number,
1 AS month_number,
1 AS month_week_count
FROM range(2015, 2031) t(year)
UNION ALL
-- Step 2: Generate weeks recursively following the 4-5-4 pattern
SELECT
fiscal_year,
week_start + INTERVAL 7 DAY AS week_start,
week_number + 1,
CASE
WHEN month_number = 12 AND ((month_week_count = 4 AND month_number % 3 = 1) OR
(month_week_count = 5 AND month_number % 3 = 2) OR
(month_week_count = 4 AND month_number % 3 = 0))
THEN 1
WHEN month_week_count = 4 AND (month_number % 3 = 1) THEN month_number + 1
WHEN month_week_count = 5 AND (month_number % 3 = 2) THEN month_number + 1
WHEN month_week_count = 4 AND (month_number % 3 = 0) THEN month_number + 1
ELSE month_number
END AS month_number,
CASE
WHEN month_week_count = 4 AND (month_number % 3 = 1) THEN 1
WHEN month_week_count = 5 AND (month_number % 3 = 2) THEN 1
WHEN month_week_count = 4 AND (month_number % 3 = 0) THEN 1
ELSE month_week_count + 1
END AS month_week_count
FROM fiscal_weeks
WHERE week_number < 52 OR (week_number = 52 AND (fiscal_year % 5 = 2)) -- Account for 53rd week
)
SELECT
fiscal_year,
week_number,
month_number,
make_timestamp(fiscal_year, month_number, 1, 0, 0, 0) AS fiscal_month_date,
week_start AS week_start_date,
make_timestamp(year(week_start + INTERVAL 6 DAY),
month(week_start + INTERVAL 6 DAY),
day(week_start + INTERVAL 6 DAY),
23, 59, 59.999) AS week_end_date
FROM fiscal_weeks
ORDER BY fiscal_year, week_number
dimensions:
- name: retail_year
sql: fiscal_year
type: number
- name: week_number
sql: week_number
type: number
- name: month_number
sql: month_number
type: number
- name: retail_month_date
sql: fiscal_month_date
type: time
- name: week_start_date
sql: week_start_date
type: time
- name: week_end_date
sql: week_end_date
type: time