मैं टाइमस्केलडीबी के गैपफिल फ़ंक्शन को एक तरह से चलाना चाहूंगा, जहां प्रारंभ और समाप्ति तिथियां स्वचालित रूप से उत्पन्न होती हैं। उदाहरण के लिए, मैं डेटाबेस में सबसे बड़ी और सबसे कम प्रविष्टियों के बीच गैपफिल फ़ंक्शन चलाना चाहूंगा।

डेटासेट खेल का मैदान दिया गया:

CREATE TABLE public.playground (
    value1 numeric,
    "timestamp" bigint,
    name "char"
);

INSERT INTO playground(name, value1, timestamp)
VALUES ('test', 100, 1599100000000000000);

INSERT INTO playground(name, value1, timestamp)
VALUES ('test', 100, 1599100001000000000);

INSERT INTO playground(name, value1, timestamp)
VALUES ('test', 100, 1599300000000000000);

मैंने डेटा को इस तरह प्राप्त करने का प्रयास किया है:

SELECT time_bucket_gapfill(300E9::BIGINT, timestamp) as bucket
FROM playground
WHERE 
    timestamp >= (SELECT COALESCE(MIN(timestamp), 0) FROM playground)
    AND
    timestamp < (SELECT COALESCE(MAX(timestamp), 0) FROM playground)
GROUP BY bucket

मुझे एक त्रुटि मिलती है:

ERROR: missing time_bucket_gapfill argument: could not infer start from WHERE clause

अगर मैं हार्ड कोडेड टाइमस्टैम्प के साथ क्वेरी का प्रयास करता हूं, तो क्वेरी ठीक चलती है। उदाहरण के लिए:

SELECT time_bucket_gapfill(300E9::BIGINT, timestamp) as bucket
FROM playground
WHERE timestamp >= 0 AND timestamp < 15900000000000000
GROUP BY bucket

गैपफिल फ़ंक्शन में तर्क के रूप में प्रारंभ और समाप्ति तिथियां प्रदान करने का एक अन्य तरीका भी विफल रहता है।

 WITH bounds AS (
  SELECT COALESCE(MIN(timestamp), 0) as min, COALESCE(MAX(timestamp), 0) as max
  FROM playground
  WHERE timestamp >= 0 AND timestamp < 15900000000000000
),
gapfill as(
SELECT time_bucket_gapfill(300E9::BIGINT, timestamp, bounds.min, bounds.max) as bucket
FROM playground, bounds
GROUP BY bucket
)
select * from gapfill

ERROR: invalid time_bucket_gapfill argument: start must be a simple expression

0
Jani 26 अक्टूबर 2020, 18:51

2 जवाब

सबसे बढ़िया उत्तर

time_bucket_gapfill केवल start और finish मान स्वीकार करता है, जिनका मूल्यांकन क्वेरी प्लानिंग समय पर स्थिरांक के लिए किया जा सकता है। तो यह स्थिरांक और now के साथ अभिव्यक्ति प्रदान करने के लिए काम करता है, हालांकि यह अभिव्यक्तियों में किसी तालिका तक पहुंचने के लिए काम नहीं करता है।

जबकि time_bucket_gapfill पर यह सीमा लागू है, एक ही प्रश्न में वांछित व्यवहार प्राप्त करना संभव नहीं है। चारों ओर काम start और finish के लिए अलग-अलग मानों की गणना करना है और फिर time_bucket_gapfill के साथ क्वेरी में मान प्रदान करना है, जिसे संग्रहीत प्रक्रिया में या एप्लिकेशन में किया जा सकता है।

एक साइड नोट, अगर PREPARE स्टेटमेंट इस्तेमाल किया जाएगा PostgreSQL 12 में, स्पष्ट रूप से अक्षम करना महत्वपूर्ण है सामान्य योजना इसी कारण से।

1
k_rus 29 अक्टूबर 2020, 12:00

WHERE क्लॉज से स्टार्ट और स्टॉप का उल्लेख करने के लिए केवल डायरेक्ट कॉलम रेफरेंस समर्थित हैं

देखें: https://github.com/timescale/timescaledb/issues/1345

तो ऐसा कुछ काम कर सकता है, (मेरे पास परीक्षण के लिए कोई timescaleDB पहुंच नहीं है) लेकिन इसे आजमाएं:

SELECT
    time_bucket_gapfill(300E9::BIGINT, time_range.min , time_range.max ) AS bucket
FROM
    (
        SELECT
            COALESCE(MIN(timestamp), 0)   AS min
            , COALESCE(MAX(timestamp), 0) AS max
        FROM
            playground
    ) AS time_range
    , playground
WHERE
    timestamp >= time_range.min
    AND timestamp < time_range.max
GROUP BY
    bucket;
1
eshirvana 26 अक्टूबर 2020, 22:36