SELECT ts, a, b, c
, COALESCE(max(a) OVER (PARTITION BY grp_a), 0)
+ COALESCE(max(b) OVER (PARTITION BY grp_b), 0)
+ COALESCE(max(c) OVER (PARTITION BY grp_c), 0) AS special_sum
FROM (
SELECT *
,count(a) OVER w AS grp_a
,count(b) OVER w AS grp_b
,count(c) OVER w AS grp_c
FROM t
WINDOW w AS (ORDER BY ts)
) sub
ORDER BY ts;
सबसे पहले, वास्तविक मान डालें और NULL
का पालन करें कुल विंडो फ़ंक्शन वाले समूह में मान count()
:यह NULL
. के साथ वृद्धि नहीं करता है मान।
फिर max()
लें आप जो खोज रहे हैं उस पर पहुंचने के लिए हर समूह से। इस बिंदु पर आप min()
. का भी उपयोग कर सकते हैं या sum()
, चूंकि प्रति समूह केवल एक गैर-शून्य मान है।
COALESCE()
कैच करता है NULL
मान यदि समय में समग्र प्रथम मान NULL
है ।
ध्यान दें कि मैंने ts
को कैसे चुना कॉलम नाम के रूप में, क्योंकि मैं time
. जैसे मूल प्रकार के नामों का उपयोग नहीं करता हूं पहचानकर्ता के रूप में।
टेस्ट केस
इसी तरह आप सभी को सबसे पहले नमूना डेटा प्रदान करना चाहिए!
CREATE TEMP TABLE t (ts int, a int, b int, c int);
INSERT INTO t VALUES
(1, 11, 21, NULL)
,(2, 12, 22, NULL)
,(3, 13, NULL, NULL)
,(4, NULL, 23, 32);