Отфильтровать обязательное поле раздела n unnest массив даты

Мне нужно опросить мою таблицу, разделенную обязательным полем Дата совершения операции.

Я хочу фильтровать свои данные только по нескольким датам, чтобы избежать восстановления большого количества данных, но у меня есть эта ошибка: Query error: Cannot query over table t without a filter over column(s) 'transactionDate' that can be used for partition elimination

Мой код:

DECLARE dates ARRAY < DATE >;

SET
dates = (
    SELECT
        ARRAY_AGG(DISTINCT(DATE(transactionDate)))
    FROM
        t
    WHERE
        transactionDate >= "1900-01-01"
        AND analyticsUpdateDate BETWEEN "2022-05-01"
        AND "2022-05-10"
);

SELECT * FROM t WHERE transactionDate IN UNNEST(dates)

Как я могу справиться с этой ошибкой, не запрашивая всю таблицу?

Спасибо за вашу помощь.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
20
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда dates пусто, условие transactionDate IN UNNEST(dates) будет false, и ваш запрос вернет ошибку:

Cannot query over table 'testset.t' without a filter over column(s) 'transactionDate' that can be used for partition elimination

DECLARE dates ARRAY <DATE>;

-- Sample table
CREATE SCHEMA IF NOT EXISTS testset;
CREATE OR REPLACE TABLE testset.t PARTITION BY (transactionDate) OPTIONS (require_partition_filter = true) AS
SELECT n, p AS transactionDate, p AS analyticsUpdateDate
  FROM UNNEST(GENERATE_ARRAY(0, 9)) n WITH OFFSET 
 CROSS JOIN UNNEST(GENERATE_DATE_ARRAY('2022-04-01', '2022-04-10')) p WITH OFFSET USING(OFFSET)
;

-- Your Query will retrun an error because `dates` is empty.
SET dates = (
    SELECT
        ARRAY_AGG(DISTINCT(DATE(transactionDate)))
    FROM
        testset.t
    WHERE
        transactionDate >= "1900-01-01"
        AND analyticsUpdateDate BETWEEN "2022-05-01"
        AND "2022-05-10"
);

SELECT * FROM testset.t WHERE transactionDate IN UNNEST(dates);

Простой обходной путь для этого — добавить условие IS NOT NULL в столбец раздела, как показано ниже.

SELECT * FROM testset.t 
 WHERE transactionDate IS NOT NULL AND transactionDate IN UNNEST(dates);

Другие вопросы по теме