SQL | Очистите данные с помощью НЕПРЕРЫВНОГО процесса сопоставления - PullRequest
0 голосов
/ 02 ноября 2018

Давайте попробуем объяснить это самыми чистыми способами.

Каков наилучший способ очистки базы данных путем непрерывного сопоставления?

Допустим, у меня есть две таблицы 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 очищаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...