เป็นไปได้ที่จะแยกตัวดำเนินการลดใน presto ออกไปหรือไม่

สงสัยว่าเป็นไปได้หรือไม่ที่จะแยกตัวดำเนินการลดใน presto ออก กรณีการใช้งานตัวอย่าง:

ฉันมีตารางที่คอลัมน์หนึ่งเป็นอาร์เรย์ของ bigints และฉันต้องการส่งคืนคอลัมน์ทั้งหมดที่ขนาดของอาร์เรย์น้อยกว่า 1,000 ดังนั้นฉันสามารถเขียนได้

select 
* 
from table 
where reduce(array_col, 0, (s,x) -> s + power(x,2), s -> if(s < power(1000,2), TRUE, FALSE))

แต่หากมีแถวจำนวนมากและอาร์เรย์มีขนาดใหญ่ อาจใช้เวลาสักครู่หนึ่ง ฉันต้องการให้โอเปอเรเตอร์แยกและส่งคืน FALSE ทันทีที่ผลรวมเกิน 1,000 ขณะนี้ฉันมี:

select 
* 
from table 
where reduce(array_col, 0, if(s >= power(1000,2), power(1000,2), s + power(x,2), s -> if(s < power(1000,2), TRUE, FALSE))

ซึ่งอย่างน้อยจะบันทึกการคำนวณบางส่วนเมื่อผลรวมเกินค่าเป้าหมาย แต่ยังต้องวนซ้ำแต่ละองค์ประกอบอาร์เรย์


person Cry Wolf    schedule 09.01.2019    source แหล่งที่มา


คำตอบ (1)


ไม่มีการรองรับ "ตัวแบ่ง" จากการลดอาร์เรย์

หมายเหตุ: ในทางเทคนิค คุณอาจพยายามแฮ็กสิ่งนี้โดยสร้างความล้มเหลว (เช่น 1/0) เมื่อคุณต้องการหยุดพักและจัดการกับ try ฉันสงสัยว่ามันคุ้มค่าแม้ว่า

person Piotr Findeisen    schedule 10.01.2019