私は次のようなpostgresテーブルを持っています:
id | user_id | state | created_at
状態は次のいずれかになります。
new, paying, paid, completing, complete, payment_failed, completion_failed
次のレポートを返すステートメントが必要です。
- 日付ごとのすべての支払済み州の合計
- 完了したすべての州の日付別の合計
- カウントされるのは、ユーザーごとに1日1つだけで、日付ごとのすべての新しい、有料の、完了した状態の合計
- すべてのpayment_failed、completion_failedの日付ごとの合計で、ユーザーごとに1日1つだけカウントされます
これまでのところ私はこれを持っています:
SELECT
DATE(created_at) AS date,
SUM(CASE WHEN state = 'complete' THEN 1 ELSE 0 END) AS complete,
SUM(CASE WHEN state = 'paid' THEN 1 ELSE 0 END) AS paid
FROM orders
WHERE created_at BETWEEN ? AND ?
GROUP BY DATE(created_at)
進行中の状態と失敗した状態の合計は、これを選択に追加することで十分に簡単です。
SUM(CASE WHEN state IN('new','paying','completing') THEN 1 ELSE 0 END) AS in_progress,
SUM(CASE WHEN state IN('payment_failed','completion_failed') THEN 1 ELSE 0 END) AS failed
しかし、user_idごとに1日1つだけin_progressを作成し、失敗した状態をカウントする方法を理解するのに苦労しています。
これが必要な理由は、統計で失敗率を操作するためです。失敗または不完全な注文をトリガーする多くのユーザーは、さらにトリガーして失敗率を膨らませます。
よろしくお願いします。