Skip to content

Commit a61e983

Browse files
committed
Fix: Restore WHERE clause and correct FLOAT cast explanation in PostgreSQL solution
1 parent 90b00e9 commit a61e983

1 file changed

Lines changed: 9 additions & 10 deletions

File tree

SQL/Leetcode/Basic select/1211. Queries Quality and Percentage/Claude Sonnet 4.6 Extended/Queries_Quality_and_Percentage_postgresql.md

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ LATERAL版: 233ms / 47% ← 不要な二重スキャン
188188
| 原因 | 詳細 |
189189
| -------------------- | ----------------------------------------- |
190190
| `::NUMERIC` キャスト | 任意精度演算 → CPU ネイティブより**低速** |
191-
| `WHERE IS NOT NULL` | 全行フィルタスキャンの追加コスト |
192191

193192
---
194193

@@ -200,26 +199,24 @@ LATERAL版: 233ms / 47% ← 不要な二重スキャン
200199

201200
SELECT
202201
query_name,
203-
ROUND(AVG(rating * 1.0 / position)::NUMERIC, 2) AS quality,
202+
ROUND(AVG(rating::float8 / position)::NUMERIC, 2) AS quality,
204203
ROUND(
205204
COUNT(*) FILTER (WHERE rating < 3) * 100.0 / COUNT(*),
206205
2
207206
) AS poor_query_percentage
208207
FROM Queries
208+
WHERE query_name IS NOT NULL
209209
GROUP BY query_name;
210210
```
211211

212212
### 変更点の差分
213213

214214
```diff
215215
- ROUND(AVG(rating::NUMERIC / position), 2)
216-
+ ROUND(AVG(rating * 1.0 / position)::NUMERIC, 2)
216+
+ ROUND(AVG(rating::float8 / position)::NUMERIC, 2)
217217

218-
-- ↑ 中間計算を FLOAT(* 1.0) で行い、最後だけ NUMERIC にキャスト
218+
-- ↑ 中間計算を float8(倍精度浮動小数点)で行い、最後だけ NUMERIC にキャスト
219219
-- NUMERIC演算はソフトウェア実装 → FLOATはCPUネイティブ命令で高速
220-
221-
- WHERE query_name IS NOT NULL
222-
-- ↑ 問題の制約上 NULL は存在しないため削除
223220
```
224221

225222
---
@@ -229,14 +226,16 @@ GROUP BY query_name;
229226
```mermaid
230227
flowchart TD
231228
A["Queries テーブル\nフルスキャン O(N)"]
229+
A_F["WHERE query_name IS NOT NULL\nNULL行を除外"]
232230
B["GROUP BY query_name\nHash Aggregate"]
233-
C["AVG(rating * 1.0 / position)\nFLOAT演算 CPU ネイティブ ⚡"]
231+
C["AVG(rating::float8 / position)\nFLOAT演算 CPU ネイティブ ⚡"]
234232
D["FILTER(rating < 3)\nCOUNT条件集計"]
235233
E["::NUMERIC キャスト\n最後の1回のみ"]
236234
F["ROUND(..., 2)"]
237235
G["出力"]
238236
239-
A --> B
237+
A --> A_F
238+
A_F --> B
240239
B --> C & D
241240
C --> E
242241
D --> E
@@ -255,7 +254,7 @@ flowchart TD
255254
【遅い】 rating::NUMERIC / position
256255
↑全行でNUMERIC(任意精度)演算 → ソフトウェアエミュレーション
257256
258-
【速い】 rating * 1.0 / position
257+
【速い】 rating::float8 / position
259258
↑FLOAT64演算 → x86 FPU / SIMD 命令で処理
260259
最後に ::NUMERIC は ROUND() のため1回だけ
261260
```

0 commit comments

Comments
 (0)