एथेना / प्रेस्टो | सेल्फ जॉइन पर ID रो का मिलान नहीं कर सकते

Jan 04 2021

मैं एक स्ट्रिंग कॉलम पर द्वि-ग्राम प्राप्त करने की कोशिश कर रहा हूं।

मैंने यहाँ दृष्टिकोण का पालन ​​किया है लेकिन एथेना / प्रेस्टो मुझे अंतिम चरणों में त्रुटि दे रहा है।

स्रोत कोड अब तक

with word_list as (
    SELECT 
      transaction_id, 
      words, 
      n, 
      regexp_extract_all(f70_remittance_info, '([a-zA-Z]+)') as f70,
      f70_remittance_info
    FROM exploration_transaction
    cross join unnest(regexp_extract_all(f70_remittance_info, '([a-zA-Z]+)')) with ordinality AS t (words, n)
    where cardinality((regexp_extract_all(f70_remittance_info, '([a-zA-Z]+)'))) > 1
    and f70_remittance_info is not null
    limit 50 )
select wl1.f70, wl1.n, wl1.words, wl2.f70, wl2.n, wl2.words
from word_list wl1
join word_list wl2 
on wl1.transaction_id = wl2.transaction_id

मैं जो विशिष्ट मुद्दा ले रहा हूं, वह बहुत अंतिम पंक्ति में है, जब मैं लेनदेन आईडी में स्वयं शामिल होने का प्रयास करता हूं - यह हमेशा शून्य पंक्तियों को वापस करता है। यह काम करता है अगर मैं केवल wl1.n = wl2.n-1(सरणी पर स्थिति) से जुड़ता हूं जो बेकार है अगर मैं इसे एक ही आईडी में नहीं डाल सकता।

एथेना प्रेस्टो द्वारा एनग्राम्स फंक्शन का समर्थन नहीं करता है, इसलिए मैं इस दृष्टिकोण के साथ बचा हुआ हूं।

कोई सुराग क्यों यह काम नहीं कर रहा है? धन्यवाद!

जवाब

GordonLinoff Jan 04 2021 at 20:08

यह अटकलबाजी है। लेकिन मैं ध्यान देता हूं कि आपका CTE limitनहीं के साथ उपयोग कर रहा है order by। इसका मतलब है कि पंक्तियों का एक मनमाना सेट लौटाया जा रहा है।

हालांकि कुछ डेटाबेस सीटीई को भौतिक करते हैं, कई नहीं करते हैं। प्रत्येक बार संदर्भित होने पर वे स्वतंत्र रूप से कोड चलाते हैं। मेरा अनुमान है कि कोड स्वतंत्र रूप से चलाया जाता है और 50 पंक्तियों के मनमाने सेट का कोई लेन-देन आईडी नहीं है।

एक समाधान order by transacdtion_idउपनगर में जोड़ना होगा ।