Давайте попробуем объяснить это самыми чистыми способами.
Каков наилучший способ очистки базы данных путем непрерывного сопоставления?
Допустим, у меня есть две таблицы TABLE_A и TABLE_B. И я хотел бы сопоставить значения переменных, как деньги. Я беру таблицу A и сопоставляю ее с B, где A_X = B_X и т. Д.
ЗДЕСЬ ХОРОШИЙ БИТ что я не уверен, как это сделать чистым способом. Мне нужен способ для процесса непрерывной очистки, чтобы при сопоставлении таблицы A с B (И ТАБЛИЦА B НЕ ВКЛЮЧАТЬ СООТВЕТСТВУЮЩИХ ЗНАЧЕНИЙ ИЗ ПЕРВОЙ ПОПЫТКИ), а затем сопоставлять таблицу A с B (когда B не содержит сопоставленных данных с 1-й и 2-й попытки)
Я ищу CLEANEST WAY, поскольку в настоящее время я использую общее табличное выражение и в основном говорю, когда значения не существуют в 1-м, 1-м и 2-м и т. Д., Что делает запрос SQL ЧРЕЗВЫЧАЙНО сложным и ограниченным.
ПОТОК ДАННЫХ
КОД ОБРАЗЦА SQL:
--#####################################################################
WITH INT1 AS (
SELECT
CMS.Store_name AS STORE_NAME,
CMS.Date AS A_DATE,
CMB.ENTRY_DATE AS B_DATE,
CMS.Cash AS A_CASH,
CMB.AMOUNT AS B_CASH
FROM `TABLE_A_DATA` AS CMS
LEFT JOIN `TABLE_B_DATA` AS CMB
ON CMS.store_name = CMB.STRAIGHT_LOOKUP
AND ROUND(CMS.Cash/50,0)*50 = ROUND(CMB.AMOUNT/50,0)*50
AND CAST(FORMAT_DATE("%F",CMB.ENTRY_DATE) AS STRING) = CAST(FORMAT_DATE("%F",DATE_ADD(CMS.Date, INTERVAL 1 day)) AS STRING)
),
--#####################################################################
INT2 AS (
WITH DATES AS (SELECT DISTINCT STORE_NAME,A_DATE FROM INT1 WHERE B_DATE IS NULL),
TABLE_B_CLEANED_DATA AS (SELECT
CMB.*
FROM `TABLE_B_DATA` AS CMB
LEFT JOIN INT1 AS INT1
ON INT1.STORE_NAME = CMB.STRAIGHT_LOOKUP
AND INT1.B_DATE = CMB.ENTRY_DATE
AND INT1.B_CASH = CMB.AMOUNT
WHERE INT1.B_DATE IS NULL
)
SELECT
CMS.Store_name AS STORE_NAME,
CMS.Date AS A_DATE,
CMB.ENTRY_DATE AS B_DATE,
CMS.Cash AS A_CASH,
CMB.AMOUNT AS B_CASH
FROM `TABLE_A_DATA` AS CMS
INNER JOIN DATES
ON CMS.Date = DATES.A_DATE
AND CMS.Store_Name = DATES.STORE_NAME
LEFT JOIN TABLE_B_CLEANED_DATA AS CMB
ON CMS.store_name = CMB.STRAIGHT_LOOKUP
AND ROUND(CMS.Cash/50,0)*50 = ROUND(CMB.AMOUNT/50,0)*50
AND CAST(FORMAT_DATE("%F",CMB.ENTRY_DATE) AS STRING) = CAST(FORMAT_DATE("%F",DATE_ADD(CMS.Date, INTERVAL 2 day)) AS STRING)
),
--#####################################################################
INT1C AS (SELECT * FROM INT1 WHERE B_DATE IS NOT NULL),
INT2C AS (SELECT * FROM INT2)
--#####################################################################
SELECT * FROM INT1C UNION ALL
SELECT * FROM INT2C
--#####################################################################
Согласно документации Google Big Query - https://cloud.google.com/bigquery/quotas#data_manipulation_language_statements
ограничение - 200 обновлений в день, поэтому использовать обновление статуса и т. д. не лучший способ.
PS. Как уже упоминалось в комментариях, я использую способ WAVE, все данные WAVE очищаются.