diff --git a/dal/db_query/queries.sql b/dal/db_query/queries.sql index c060422..e97769b 100644 --- a/dal/db_query/queries.sql +++ b/dal/db_query/queries.sql @@ -317,4 +317,71 @@ FROM answer a WHERE a.id = ANY($1::bigint[]) AND a.deleted = FALSE AND q.accountid = $2 AND a.start = false; -- name: CheckResultOwner :one -SELECT q.accountid FROM answer a JOIN quiz q ON a.quiz_id = q.id WHERE a.id = $1 AND a.deleted = FALSE AND a.start = false; \ No newline at end of file +SELECT q.accountid FROM answer a JOIN quiz q ON a.quiz_id = q.id WHERE a.id = $1 AND a.deleted = FALSE AND a.start = false; + +-- name:DeviceStats :many +WITH DeviceStats AS ( + SELECT + device_type, + COUNT(*) AS device_count + FROM + answer + WHERE + quiz_id = $1 + AND created_at >= to_timestamp($2) + AND created_at <= to_timestamp($3) + AND result = TRUE + GROUP BY + device_type +), + OSStats AS ( + SELECT + os, + COUNT(*) AS os_count + FROM + answer + WHERE + quiz_id = $1 + AND created_at >= to_timestamp($2) + AND created_at <= to_timestamp($3) + AND result = TRUE + GROUP BY + os + ), + BrowserStats AS ( + SELECT + browser, + COUNT(*) AS browser_count + FROM + answer + WHERE + quiz_id = $1 + AND created_at >= to_timestamp($2) + AND created_at <= to_timestamp($3) + AND result = TRUE + GROUP BY + browser + ), + TotalStats AS ( + SELECT + COUNT(*) AS total_count + FROM + answer + WHERE + quiz_id = $1 + AND created_at >= to_timestamp($2) + AND created_at <= to_timestamp($3) + AND result = TRUE + ) +SELECT + device_type, + (device_count::FLOAT / total_count) * 100 AS device_percentage, + os, + (os_count::FLOAT / total_count) * 100 AS os_percentage, + browser, + (browser_count::FLOAT / total_count) * 100 AS browser_percentage +FROM + DeviceStats, + OSStats, + BrowserStats, + TotalStats; \ No newline at end of file diff --git a/repository/statistics/statistics.go b/repository/statistics/statistics.go index a32a446..9f9a234 100644 --- a/repository/statistics/statistics.go +++ b/repository/statistics/statistics.go @@ -1,6 +1,7 @@ package statistics import ( + "context" "database/sql" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal/sqlcgen" ) @@ -21,3 +22,23 @@ func NewStatisticsRepo(deps Deps) *StatisticsRepository { pool: deps.Pool, } } + +type DeviceStatReq struct { + QuizId string + From uint64 + To uint64 +} + +type DeviceStatResp struct { + Device map[string]float64 + OS map[string]float64 + Browser map[string]float64 +} + +func (r *StatisticsRepository) GetDeviceStatistics(ctx context.Context, req DeviceStatReq) DeviceStatResp { + resp := DeviceStatResp{ + Device: make(map[string]float64), + OS: make(map[string]float64), + Browser: make(map[string]float64), + } +}