2016-08-19 2 views
0

は、私は、テーブル内の各アプリの統計情報を集約したい戻るapps集計列はゼロ

私は、次のクエリを持っていますが、何らかの理由ですべての結果は、なぜあなたはそうしている0

select 
    a.id, 
    'support' as domain, 
    'summary' as type, 
    90 as interval, 
    json_build_object(
     'new', count(new), 
     'closed', count(closed_c), 
     'reply_rate', count(reply_rate), 
     'median_response', max(median_response.response_time) 
    ) as data 
from apps a 
full join (
    SELECT * from conversations c 
    WHERE c.started_at::date > (current_date - (90 || ' days')::interval)::date 
) as new on new.app_id = a.id 
full join (
    SELECT * from conversations c 
    WHERE c.closed_at::date > (current_date - (90 || ' days')::interval)::date 
) as closed_c on closed_c.app_id = a.id 
full join (
    SELECT * from conversations c 
    WHERE c.started_at::date > (current_date - (90 || ' days')::interval)::date AND c.first_response_at is not null 
) as reply_rate on reply_rate.app_id = a.id 
full join (
    SELECT c.app_id, extract(epoch from (c.first_response_at - c.started_at)) as response_time, ntile(2) OVER (ORDER BY (c.first_response_at - c.started_at)) AS bucket FROM conversations c 
    WHERE c.started_at::date > (current_date - (90 || ' days')::interval)::date AND c.first_response_at is not null 
) as median_response on median_response.app_id = a.id 
where a.test = false 
group by a.id 
+0

「max(median_response.response_time)」も0を返しますか? 'a.id'の値を取得していますか?サブクエリのレコードを取得していますか?彼らは正しく結合されていますか?集約は 'json_build_object()'の外で動作しますか? Count(new)の代わりにCount(new。*)に変更するとどうなりますか? – JNevill

+0

それは 'null'を返します。私は 'a.id'の値を取得しています。サブクエリはレコードを返す必要がありますか?彼らは外で働く。 – Tarlen

+0

集計式は 'json_build_object()'の外で動作しますか?それは本当にものを絞り込む! – JNevill

答えて

1

すべてがゼロである理由を正確に私が言うことはできませんが、

#1:full joinが原因に(left joinに置き換える必要がありますwhere a.test = false

#2:異なる条件で同じテーブルに4回アクセスすると、おそらく条件付き集計を使用して1つの選択で置き換えることができます。

これが正しいカウントを返すかどうかを確認してから、左に結合してappsにします。

select 
    app_id, 
    sum(new), 
    sum(closed_c), 
    sum(reply_rate), 
    max(case when bucket = 1 then response_time end) 
from 
(
    SELECT app_id, 

     1 as new, 

     case when c.closed_at::date > (current_date - (90 || ' days')::interval)::date then 1 else 0 end as closed_c, 

     case when c.first_response_at is not null then 1 else 0 end as reply_rate, 

     extract(epoch from (c.first_response_at - c.started_at)) as response_time, 

     ntile(2) OVER (ORDER BY (c.first_response_at - c.started_at)) AS bucket 
    FROM conversations c 
    -- assuming that closed_at is always after started_at 
    WHERE c.started_at::date > (current_date - (90 || ' days')::interval)::date 
) as dt 
group by app_id 
+0

これはほぼ正しいですが、問題は、最後の90日間に開始された会話をhvaeしない 'apps'を返さないということだけです。これは、これらのアプリケーションIDを返す必要がありますが、要約には0が入ります。 – Tarlen

+0

@Tarlen:そのため、 'apps'に' left join'をしてから 'coalesce(...、0)'を使ってゼロ。 – dnoeth

+0

私はあなたに従っているかどうかはわかりませんが、上記のいずれの結合も使用していませんか? – Tarlen

0

を返しますそれらのテーブルから単一の列を使用しないと、多くの結合が行われますか?

あなただけカウントする必要がある場合は、ちょうどそのよう行うことができます。また

select 
    a.id, 
    'support' as domain, 
    'summary' as type, 
    90 as interval, 
    json_build_object(
     'new',    (SELECT count(*)              from conversations c WHERE c.app_id = a.id and c.started_at::date > current_date - 90), 
     'closed',   (SELECT count(*)              from conversations c WHERE c.app_id = a.id and c.closed_at::date > current_date - 90), 
     'reply_rate',  (SELECT count(*)              from conversations c WHERE c.app_id = a.id and c.started_at::date > current_date - 90 and c.first_response_at is not null), 
     'median_response', (SELECT max(extract(epoch from (c.first_response_at - c.started_at))) from conversations c WHERE c.app_id = a.id and c.started_at::date > current_date - 90 and c.first_response_at is not null) 
    ) as data 
from apps a 
where a.test = false 

、なぜあなたはdate型に日加算/減算する間隔を使用していますか?

あなたはちょうどcurrent_date - 90を行うことができます。

私はあなたがあまりにも conversationsにいくつかのインデックスを作成することをお勧めし

create index i_conversations_started_at on conversations (id, started_at::date); 
create index i_conversations_closed_at on conversations (id, closed_at::date); 
+0

これはきれいに見えますが、それは約10倍の遅さですが、0の値で問題を解決しない場合は – Tarlen

+0

、それが遅い場合は正しいインデックスを作成する必要があります。 – Christian

+0

0値にはどのような問題がありますか? – Christian