मैं नेस्टेड क्वेरी में दो बार "समूह द्वारा" से कैसे बचूं - sql, postgresql, group-by, subquery

मैं निम्नलिखित संबंधों के साथ विशेषताओं के लिए यह प्रश्न लिख रहा हूं।

 State->City->Customer->Service Order.

सभी एक से कई। समूह द्वारा समूहित सबक्वायरी svc_ord_nbr जबकि बाहरी क्वेरी किसी और चीज पर एक और समग्र करता है।

select state, city, cust_name,
count(distinct (case when start_date <> end_date then svc_ord_nbr end)) as not_fixed
from
(SELECT svc_ord_nbr, CUST_NAME,
state, city,
date_trunc("day", min(START_DTM)) as start_date,
date_trunc("day", max(START_DTM)) as end_date
FROM table a inner join...
inner join....
WHERE ......
group by SVC_ORD_NBR,
cust_name,
state,
city) q
group by state, city, cust_name

राज्य और शहर को प्रदर्शित करने के लिए, ऐसा लगता है कि मुझे आंतरिक और बाहरी दोनों क्वेरी में दो बार समूह करना होगा। मुझे आश्चर्य है कि यह करने का यह सबसे अच्छा तरीका है।

उत्तर:

जवाब के लिए 0 № 1

मुझे नहीं लगता कि आप "2 परतें" करने से बच सकते हैंक्योंकि आप svc_ord_nbr द्वारा MIN / MAX की गणना कर रहे हैं, फिर बाद की गणना के लिए उन गणनाओं का उपयोग कर रहे हैं। आप केवल आंतरिक परत में svc_ord_nbr से निपटकर इसे थोड़ा सा सरल बना सकते हैं।

SELECT
state
, city
, cust_name
, COUNT(DISTINCT (CASE WHEN start_date <> end_date THEN svc_ord_nbr END)
) AS not_fixed
FROM (
SELECT
svc_ord_nbr
, date_trunc("day", MIN(START_DTM)) AS start_date
, date_trunc("day", MAX(START_DTM)) AS end_date
FROM tablea a
WHERE ......
GROUP BY
svc_ord_nbr
) q
inner join...
inner join....
GROUP BY
state
, city
, cust_name

जवाब के लिए 0 № 2

एक सरलीकरण जो मैं देख सकता हूं वह छुटकारा पा रहा है count(distinct) बाहरी स्तर पर। इसके बजाय आप बस कर सकते हैं:

select state, city, cust_name,
sum((start_date <> end_date)::int) as not_fixed
. . .

ऐसे विशेष मामले हो सकते हैं जहां आप एकत्रीकरण के दो स्तरों से छुटकारा पा सकते हैं, मैं एक सामान्य समाधान के बारे में सोच नहीं सकता।


संबंधित सवाल
सबसे लोकप्रिय