2017-11-03 8 views
1

次の関係を持つ属性に対してこのクエリを作成しています。ネストされたクエリで「グループ化」を2回回避する方法

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

すべて1対多数。サブクエリは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 

州と都市を表示するために、内部クエリと外部クエリの両方でそれらを2回グループ化する必要があるようです。これが最善の方法であるかどうかは疑問です。

+0

@GordonLinoffは 'date_trunc'を使っているはずです – ddd

+0

' inner join .... '::いくつかのメタ構文ではなく、実際のクエリを投稿してください。 – wildplasser

+0

操作ごとの内部グループと外部グループで、同じ順序でリストされた列のSVC_ORD_NBRが最後にある場合は、パフォーマンスが向上するでしょう。 –

答えて

0

svc_ord_nbrでMIN/MAXを計算しているため、後のカウントでこれらの計算を使用しているため、「2レイヤー」を実行することは避けられないと思います。内部層の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

あなたの質問は今解決されましたか?あなたはまだこの答えについて質問がありますか? [help/accepting](https://stackoverflow.com/help/someone-answers)の詳細については、[** Click The Tick **](https://ibb.co/ikqyO6) –

0

一つの単純化は、外側のレベルでcount(distinct)を退治されます。代わりに、あなただけ行うことができます。

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

を、私は一般的な解決策を考えることはできませんあなたが集約2つのレベルを取り除くことができ、特別な場合、あるかもしれません。

関連する問題