Tôi có một bảng postgres trông như thế này:SQL tổng giá trị cột, độc đáo cho mỗi người dùng mỗi ngày
id | user_id | state | created_at
Tình trạng có thể là bất kỳ những điều sau đây:
new, paying, paid, completing, complete, payment_failed, completion_failed
Tôi cần một tuyên bố trả lại báo cáo với các thông tin sau:
- tổng của tất cả các trạng thái thanh toán theo ngày
- tổng của tất cả các quốc gia hoàn thành vào ngày
- tổng của tất cả mới, thanh toán, hoàn thành tiểu bang theo ngày với chỉ có một cho mỗi người dùng mỗi ngày được tính
- tổng của tất cả payment_failed, completion_failed theo ngày với chỉ có một cho mỗi người dùng mỗi ngày được tính
cho đến nay tôi có điều này:
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)
Một tổng của các cơ bản dở dang và các quốc gia thất bại là đủ dễ dàng bằng cách thêm này để chọn:
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
Nhưng tôi đang gặp khó khăn trong việc tìm ra cách chỉ thực hiện một lần cho mỗi user_id mỗi ngày in_progress và các trạng thái không được tính.
Lý do tôi cần điều này là thao túng tỷ lệ thất bại trong số liệu thống kê của chúng tôi, vì nhiều người dùng kích hoạt lỗi hoặc không đầy đủ sẽ kích hoạt nhiều hơn làm tăng tỷ lệ lỗi của chúng tôi.
Cảm ơn bạn trước.
phiên bản PostgreSQL của bạn? –
@IgorRomanchenko 9.1.6 –