В BigQuery, устаревший SQL, у меня есть этот запрос (после серьезного упрощения и анонимности конфиденциальные данные мне не разрешено раскрывать):
SELECT
TABLE1.t as t,
TABLE1.feat1 as feat1,
TABLE1.feat2 as feat2,
TABLE1.id as id,
TABLE1.feat3 as feat3,
TABLE2.time2 as time2,
FROM
(SELECT
time.hour as t,
feat1,
feat2,
feat4,
featA.id as id,
feat3,
FROM FLATTEN(BIGTABLE, featA.id)
WHERE _PARTITIONTIME > TIMESTAMP(1590883200+9*60*60*24) AND _PARTITIONTIME <= TIMESTAMP(1590883200+11*60*60*24)
AND feat2 = "ab" and feat1 = "AB" and feat4 = "DD"
AND featA.id = "somehash" and feat3 = "KD"
GROUP BY 1,2,3,4,5,6) as TABLE1
LEFT JOIN (
SELECT
featB.share_time.hour as t,
time.hour as time2,
featB.id as id,
feat2,
featB.feat1,
featB.feat4 as feat4,
featB.feat3 as feat3,
FROM BIGTABLE
WHERE featB.id IS NOT NULL
and _PARTITIONTIME > TIMESTAMP(1590883200+10*60*60*24) AND _PARTITIONTIME <= TIMESTAMP(1590883200+11*60*60*24)
AND featB.time_since_event < 1440
GROUP BY 1,2,3,4,5,6,7
) as TABLE2
ON TABLE2.t = TABLE1.t
AND TABLE2.id = TABLE1.id
AND TABLE2.feat4 = TABLE1.feat4
AND TABLE2.feat2 = TABLE1.feat2
AND TABLE2.feat1 = TABLE1.feat1
AND TABLE2.feat3 = TABLE1.feat3
order by t
Сейчас. Проблема в том, что удаление предложения FLATTEN
приводит к другим результатам, чем его сохранение (т. Е. FROM FLATTEN(BIGTABLE, featA.id)
приводит к другим результатам, чем просто FROM BIGTABLE
), и с FLATTEN я теряю некоторые строки, которые мне нужны.
Две части _PARTITIONTIME
намеренно различаются, чтобы разрешить инкрементную загрузку таблицы, позволяя при этом LEFT JOIN не терять данные из-за _PARTITIONTIME
. Если оба _PARTITIONTIME
похожи, тогда я не вижу проблемы (но я не могу загружать данные постепенно).
Это особенно проблема здесь, потому что в исходном запросе-монстре, что * За 1014 * следовало LEFT JOIN
на featA.id
, а FLATTEN
требуется (насколько я знаю), чтобы избежать дублирования регистров featA.id
.
Кроме того, если я выделю этот подзапрос в, просто:
SELECT
time.hour as t,
feat1,
feat2,
feat4,
featA.id as id,
feat3,
FROM FLATTEN(BIGTABLE, featA.id)
WHERE _PARTITIONTIME > TIMESTAMP(1590883200+9*60*60*24) AND _PARTITIONTIME <= TIMESTAMP(1590883200+11*60*60*24)
AND feat2 = "ab" and feat1 = "AB" and feat4 = "DD"
AND featA.id = "somehash" and feat3 = "KD"
GROUP BY 1,2,3,4,5,6
результат идентичен независимо от того, присутствует FLATTEN
или нет.