0

私は次の問題のためにSQLを書くのに非常に苦労しています:

テーブル「answers」に次のデータベース列があります

user_id integer,
question_id integer,
session_id text,
crated_date timestamp,
correct_answer boolean

ここで、セッションのリストを作成し、そのセッションのすべての質問に対する正解と不正解の最初の回答を数えたいと思います。各ユーザーは、1回のセッション中に同じ質問に何度も回答する可能性があります。セッションに最初に表示されたときに、正解または不正解があった質問の数を知りたいのですが。列created_dateは回答の順序を決定します。私が取得しようとしている結果は、次の形式である必要があります。

session_id text,
user_id integer,
questions_answered_correctly_first_time_in_session integer,
questions_answered_incorrectly_first_time_in_session integer,
questions_answered_correctly_after_first_time_in_session integer,
questions_answered_incorrectly_after_first_time_in_session integer

どんな助けもいただければ幸いです:)

4

1 に答える 1

1

これがうまくいくかどうかは100%確信が持てませんが、試してみてください:

これはオンザフライで構築されたアイデアであることに注意してください。私はパフォーマンスをまったく見ていません。もっと良い方法があるかもしれません。

with first_answers as (select
        session_id,
        question_id,
        min(created_date) as created_date,
        TRUE as first_answer
    from answers
    group by session_id, question_id)
select
    first.session_id,
    first.user_id,
    sum(case when coalesce(first_answer, FALSE) and correct_answer then 1 else 0 end),
    sum(case when coalesce(first_answer, FALSE) and not correct_answer then 1 else 0 end),
    sum(case when not coalesce(first_answer, FALSE) and correct_answer then 1 else 0 end),
    sum(case when not coalesce(first_answer, FALSE) and not correct_answer then 1 else 0 end)
from answers left join first_answers using (session_id, user_id, created_date)
group by session_id
于 2013-02-08T02:01:30.567 に答える