diff --git a/app/Models/CollectorModel.php b/app/Models/CollectorModel.php index 0a8eadd..cb00a74 100644 --- a/app/Models/CollectorModel.php +++ b/app/Models/CollectorModel.php @@ -44,7 +44,7 @@ class CollectorModel extends CommonModel * @param string $endDate '2024-10-30' * @return mixed 해당 자리의 수치값 */ - public function get95PercentileValue(TrafficEntity $trafficEntity, string $field, string $startDate, string $endDate) + public function get95PercentileValue_OLD(TrafficEntity $trafficEntity, string $field, string $startDate, string $endDate) { // 1) 해당 조건의 전체 개수 구하기 $total = @@ -70,8 +70,22 @@ class CollectorModel extends CommonModel // 🔥 실행되기 전에 SQL 확인 $sql = $builder->getCompiledSelect(false); //반드시 false해야 queryu reset 않함 log_message('debug', '[95PERCENTILE QUERY] ' . $sql); - - $row = $builder->get()->getRowArray(); + $row = $builder->get()->getFirstRow('array'); return $row[$field] ?? null; } + + public function get95PercentileValue(TrafficEntity $trafficEntity, string $field, string $startDate, string $endDate) + { + $sql = "WITH ranked AS ( + SELECT `{$field}`,`created_at`, ROW_NUMBER() OVER (ORDER BY `in` DESC) AS rn,COUNT(*) OVER () AS total + FROM {$this->table} + WHERE trafficinfo_uid = ? + AND created_at BETWEEN ? AND ? +) +SELECT `{$field}` +FROM ranked +WHERE rn = FLOOR(total * 0.05) + 1 +LIMIT 1"; + return $this->query($sql, [$trafficEntity->getPK(), $startDate, $endDate])->getRowArray()[$field]; + } }